指標的初始化

2021-06-29 01:23:37 字數 2391 閱讀 9067

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...