1. 字元指標的初始化
在c語言中 "string"儲存的就是首個字元所在的位址 所以可以把 字串常量"string" 賦值給指標 char *p; p="string" 但不能把字串常量直接賦給陣列,需要用到 strcpy。 但可以對陣列初始化為字串,也就是字元陣列。如 char str = "string";
兩種初始化的區別:char * p="the fine day" 和 char str="the fine day" 不同, 這兩個都是給字串的初始化,前者只是把字串的首位址給str,沒有分配足夠的記憶體位址來儲存整個字串 , 後者初始化的同時,把他們儲存在陣列中,也就是分配好了所有字元需要的記憶體。 所以:
(1) char *p = "string"; //
位址變數p
儲存的是 's' 的位址,,
(2) char str = "the fine day"; //字元陣列str儲存的是整個字串,某些情況下退化為指標
(3) char *str1 = "the day"; // ok.
此時,如果要複製另乙個字串str1 到p或str:
strcpy(p, str1); //
錯誤!需改為 p=(char*)malloc( strlen(str1)+1 ); 才正確
strcpy(str, str1); //
沒錯誤,已有足夠記憶體,但不能總是保證。
strncpy(str, str1, strlen(str) ); //
正確!不作討論
實際上,(1)中是不對的,好像新標準已經會報錯;
通常應該這樣初始化:strcpy(p, "string");
或者改為:const *p = ""string"; 但這樣就不能修改p了。
2. 整形指標的初始化
試看下面語句哪一行 能夠 列印輸出?
int a = 10;
int * p1 = 0;
int * p2 = &a; //常見,初始化為某變數的位址
int * p3 = 20;
printf("p1=%p, *p1=%d\n", p1, *p1);
printf("p2=%p, *p2=%d\n", p2, *p2);
printf("p3=%p, *p3=%d\n", p3, *p3);
這幾行語句編譯時會有警告:p3那一行將整數賦值給指標,沒做型別轉換。
執行時會導致崩潰。
為什麼呢?
仔細看一下,int * p1 = 0; //真的初始化了嗎?
int * p3 = 20; // *p3 初始化成20了嗎?
其實int *p1 = 0 相當於 int *p1 = null,不能讀取空指標 p1 以及 *p1 的值!
而 int *p3 = 20 相當於 int *p3; p3 = (int *)0x00000014; 不能讀取*p3的值。
3. 指標陣列的初始化
問題一:
const char *p =; // 這樣在定義p的時候完成了初始化,那麼
int *p1 =; //
wrong!
為什麼不可以? 如何在定義p1的時候進行初始化?
int *p2 = ; //
ok. 這樣又可以了?
問題二:
我想定義乙個指標陣列(雖然很少人用這個東西),那麼,對這個指標的初始化怎麼做?
int * pstr[5];
------------------------
const char *p = ; 指向字元的指標陣列,陣列中的元素是字串,指標陣列儲存的是字串首位址,沒有問題。
對於int *p1 =而言,存在二義性,它既可以表示int p1[2][0],即p1[0][0]=1,p1[1][0]=2
也可表示為int p1[n][2],即:p1[0][0]=1,p1[0][1]=2;
我們可以這樣:
int *p[3];
for(i=0; i<3; ++i)
/* do something with p[i] */
for(i=0; i<3; ++i)
不然怎麼樣呢? 這樣比較好:
int arr[3][2] = , , };
int *pa[3];
for(int i=0; i < 3; ++i)
而 int *p[3] = , , }; 是不行的!warning一堆。
4. struct 指標的初始化
struct_type *p;
p = (struct_type *)malloc( sizeof(struct_type) );
總之,盡量用其他變數來初始化指標。
初始化指標
includeusing namespace std int main nullptr 是 c 新標準引入的特性,visual c 2010 編譯器支援它。過去已經使用0或 null 編譯器將用 0代替此巨集 來初始化指標,當然它們現在仍然可以使用。但是,使用 nullptr 初始化指標要好得多。因...
指標的初始化
指標代表的是記憶體單元的編號或位址,通過指標就可以找到對應的記憶體單元。對指標進行初始化或賦值的實質是將乙個位址或同型別 或相相容的型別 的指標賦給它,而不管這個位址是怎麼取得的。1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int ...
指標的初始化
下面的函式有什麼錯誤 int square volatile int ptr 這段 的目的是用來返指標 ptr指向值的平方,但是,由 於 ptr指向乙個volatile型引數,編譯器將產生類似下面的 int square volatile int ptr 由於 ptr的值可能被意想不到地該變,因此a...