c語言定義指針數組
1. c語言選擇題,關於指針數組。求詳解
int a[2][3]; 定義了一個二維函數,每一維數組有三個元素。
int (*pt)[3]; 定義了一個數組指針,也就是定義了一個指向有三個元素的指針,即該指針,每次自加1,地址跳過三個int
pt=a; 就是讓pt指向a[0],注意a[0]是一個數組地址,裡面有三個元素
對於A選項,pt[0][0]是正確的,pt[0][0]等價於a[0][0]
對於B選項,不正確,因為pt+1就是a[1], *(pt+1)[2]相當於a[3][0]不對。
因為運算符優先順序,[]大於*,因此*(pt+1)[2]就是*pt[1+2] 也就是*a[1+2]。而*a[3]就等價於a[3][0]。越界了
改成(*(pt+1))[2]就對了,相當於a[1][2]
對於C選項,正確,*(pt[1]+2) 相當於a[1][2]
對於D選項,正確,*(a[0]+2)相當於a[0][2]
2. c語言什麼時候使用數組,什麼時候使用指針
任何時候都可以使用數組,使用指針。
定義時,通常只有字元指針,和字元數組指針直接定義。用來表示字元串或字元串數組。
其他一般定義數組。操作時用指針或數組。
其他指針,多半用在參數傳遞,數據結構內部(不確定需要內存的大小,或者鏈表,二叉樹等鏈式結構)的時候。
還有一種是有些函數參數就是指針,這時定義一個指針,來操作傳進來的指針參數比較好。
指針作為參數,有一下幾種用法,
1)當作數組用,用來獲取或設置數組元素。
2)把一個比較長的數據結構傳入函數,只需要一個指針就夠了。
3)傳入變數的地址,用來讀取或修改變數的值,主要是為了修改用。
直接定義一個不指向任何對象的指針,並且也從不給他賦值,沒什麼意義;
指針要麼指向數組,要麼指向變數,要麼動態申請內存。
NULL指針,只是一個方便的指針,表示不指向任何對象。
真正有用的還是指向具體對象的指針。
如果定義了一個指針,使用時要讓他指向一個具體對象,當需要他不指向什麼對象的時候,給他賦值為NULL;
PS:
C語言,數組名只是一個指針常量而已,離開定義可見處,數組大小的信息就不存在了。
只有定義完全可見的地方,才可以獲得數組的大小。
數組作為函數的參數,和外部引用聲明都不能獲得數組的大小。
參數只能傳遞指針,參數的大小隻是指針的大小;
只能看到聲明的地方,獲取數組大小的努力,只能換來錯誤。
void fun1(int a[10]) //<==> void fun1(int a[]) <==>void fun1(int *a)
{
}
void fun2(int [10][10])// <==>void fun2(int a[][10])<==> void fun2(int (*a)[10])
{
}
3. C語言,指針 與 數組。
比如
p指向的是數組第一個元素的地址 所以*p就是取p指向的這個地址的值.
B錯在str是指向字元串的指針
比如
printf("%s\n",str);會輸出整個Program
由此可以說明BCD都是錯的
字元串的表現形式
在C程序中,可以用兩種方法實現一個字元串。
1. 用字元數組實現。
[例8.11]
void main(void)
{static char string [ ]="I Love China!";
printf("%s\n",string);
}
運行時輸出: I Love China!
和前面介紹的數組屬性一樣,string是數組名,它代表字元數組的首地址,(見圖8.17)。string[4]代表數組中序號為4的元素(v),實際上string[4]就是*(string+4),string+4是指向字元「v」指針。
2. 用字元指針實現。
可以不定義字元數組,而定義一個字元指針。用字元指針指向字元串中的字元。
[例8.12]
void main(void)
{char *string="I Love China!";
printf("%s\n",string);
}
在這里沒有定義字元數組,但C語言對字元串常量是按字元數組處理的,實際上在內存開辟了一個字元數組用來存放字元串數組。在程序中定義了一個字元指針變數string。並把字元串首地址(即存放字元串的字元數組的首地址)賦給它(見圖8.18)。有人認為string是一個字元串變數,以為定義時把"I Love China!"賦給該字元串變數,這是不確切的。