當前位置:首頁 » 編程語言 » c語言指針數組
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言指針數組

發布時間: 2022-02-12 13:48:04

c語言指針數組問題

char *a={"abc"}; a 是指針。
char c[]={"abc"}; c 是數組。
初始化後 sizeof(a) 為 4,strlen(a) 為3。
同樣,sizeof(c) 為 4,strlen(c) 為3。

在語句中有時一樣,有時不一樣。

例如:
char *a={"abc"};
char c[]={"abc"};
char b[]={"123"};
int L;
L = sizeof(a);
printf("a: %d %s\n",L, a);

a=b; // a 允許
L = sizeof(a);
printf("a: %d %s\n",L, a);

L = sizeof(c); // a,c 方法一樣
printf("c: %d %s\n",L, c); // a,c 方法一樣

// wrong c=b; // c 不允許
strcpy(c,b); // c 只能這樣做
L = sizeof(c);
printf("c: %d %s\n",L, c);

注意 a=b; 允許。c=b; 不允許 。 只能 strcpy(c,b);
輸出:
a: 4 abc
a: 4 123
c: 4 abc
c: 4 123

㈡ c語言指針數組

p是int類型指針,指向數組a的第1個元素即一個一維的數組{1,2,3}首地址所以p[1]相當於a[0][1]所以printf("%d\n",p[1]);
輸出2 。 int **pp =pa 是聲明了一個指向pa的指針,而pa又是指向a首地址的int類型指針。pa指向的是a的第一維,pa[0] = a[0] ,pp[2][1]相當於a[2][1]而a數組的[2]中只初始化了[2][0]位置的7,那[2][1]位置就是默認的值0,所以printf("%d\n",pp[2][1]);
輸出0

㈢ C語言 指針數組的使用

int**a可以表達一個二維數組。為什麼呢?

你可以這么理解*p[3]表達的是一個數組指針,這個指針p[0]表示的是數組存的第一個地址。而數組實際上是一串連續地址的塊。每一個小塊存著一個內容。每次訪問數組時,你為什麼可以用數組名+下標訪問呢?//比如a[i];

實際上就是訪問*a+i;*這個符號可以表示你存的是變數的地址。而數組地址的第一位為int類型變數存的地址(你可以直接使用數組的地址加上單位變數的空間的大小去訪問下個元素)。在這個程序中int*p[3]表示可以存三個int類型的地址。而p正好把二維數組的三個一維數組的開頭的int類型變數的地址給存起來了。

給你舉個例子

實際上p[i]與 *(p+i)是表達的是同一個意思。只不過只有數組可以定義一個連續的空間

(數組的第一個地址是隨機的其他的是連續的。)單獨用指針的話會隨機分配的

數組的指針可以存三個地址。當然可以訪問二維數組了。

㈣ c語言指針數組問題

這個題目比較蛋疼,但是只要理解指針,其實也不難理解
就是手工計算繁瑣一點

二維數組,相當於兩層指責你,**
*(*(a+i)+j)這個表示第i行第j個元素的值,。如果不理解,記住即可
有兩個*,是兩層指針
pa看了你沒問題
關鍵是p

p在程序中有定義,在pa的後面
a a[0] &a[0][0]這三個指針雖然只想同一個地方,是a首地址的值,但是用起來是不一樣的

㈤ c語言指針,指向數組的指針、指向指針數組的指針、指向數組的指針的指針,分別如何定義

解答:
1. 如何聲明一個指針,這個指針是指向整個數組的,數組有n個元素,每個元素是int,不是int (*p)[n],而是最簡單的int*p;
2. 如何聲明一個指針,這個指針也是指向數組的,數組有n個元素,每個元素不是int,而是指針int*;這個指針是int**p;
3. 又如何聲明一個指針,它指向另一個指針,這「另一個指針」指向一個數組,數組元素是int;這個指針仍然是int**p。

㈥ c語言數組指針

② 指向iArray[1]輸出2 (因為*(++p)是先自加然後取指針內容)
③ 指向iArray[1]輸出4 (因為②時p已經成了1,p+2就是3,iArray[3]就是4)
④ 指向iArray[0]輸出2 (因為*(p--)相當於 *(p) ;p--; 是先取值, 然後自減,自減後p=0)
/******
④有異議 不管怎麼樣, 輸出的都是2 ,因為假如是 printf("%d",$(p--)); 則是 printf("$d,$p");p--; 就是輸出的時候, p是指向iArray[1], 但是輸出後就變成了指向iArray[0]了,-----------這里問的p指向:如果是輸出時的指向, 就是iArray[1],如果是輸出後的指向, 就是iArray[0] ,因為這里先問的輸出,又問的指向,所以當作是輸出後指向 所以是iArray[0]
*******/
⑤ 指向iArray[0]輸出1 (因為*p++ 是得到p指向的值之後,把那個值自加 ,但是*p++是先使用*p然後*p自加所以輸出的時候還是*p的內容 ,但是注意, 這時*p已經是2了,也就是iArray[0]從1變成了2)
⑥ 指向iArray[0]輸出2 (因為p是指向數組的索引0的位置,⑤中指針位置沒變,變得是裡面的值,本來是1, ⑤之後變成了2)
⑦ 指向iArray[0]輸出3 (因為++(*p)是取出*p之後, 自加, 然後輸出,所以*p是2 2++是3)
⑧ 指向iArray[0]輸出3 (⑦中沒改變指針, 只改變了指針指向的位置的值, 是⑦中2++的結果,是3)

/*
這里考驗的是i++ 和++ i的區別
比如 a=i++; 相當於 a=i; i++;
而 a=++i ; 則相當於 i++;a=i;
一個是先賦值再遞加,一個是先遞加再復制
另一個是考*p++和*(p++)的區別, *p++改變的是*p的值就是指針指向的值 , 而*(p++)改變的是p的值
*/

㈦ C語言 指針數組

數組指針(也稱行指針)
定義 int (*p)[n];
()優先順序高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型數據的長度。
如要將二維數組賦給一指針,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義一個數組指針,指向含4個元素的一維數組。
p=a; //將該二維數組的首地址賦給p,也就是a[0]或&a[0][0]
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]
所以數組指針也稱指向一維數組的指針,亦稱行指針。
指針數組
定義 int *p[n];
[]優先順序高,先與p結合成為一個數組,再由int*說明這是一個整型指針數組,它有n個指針類型的數組元素。這里執行p+1時,則p指向下一個數組元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指針變數可以用來存放變數地址。但可以這樣 *p=a; 這里*p表示指針數組第一個元素的值,a的首地址的值。
如要將二維數組賦給一指針數組:
int *p[3];
int a[3][4];
p++; //該語句表示p數組指向下一個數組元素。註:此數組每一個元素都是一個指針
for(i=0;i<3;i++)
p[i]=a[i]
這里int *p[3] 表示一個一維數組內存放著三個指針變數,分別是p[0]、p[1]、p[2]
所以要分別賦值。

㈧ c語言關於指針數組

指針數組,顧名思義,是由指針構成的數組,所以數組中的每個元素當然都應該是指針,也就是地址。

㈨ C語言中,如何定義一個『指針數組』,這個『指針數組』專門用來存放『數組指針』。

指針數組定義int*p[n];

[]優先順序高,先與p結合成為一個數組,再由int*說明這是一個整型指針數組,它有n個指針類型的數組元素。這里執行p+1時,則p指向下一個數組元素,

這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指針變數可以用來存放變數地址。但可以這樣*p=a;這里*p表示指針數組第一個元素的值,a的首地址的值。

數組指針定義int(*p)[n];

()優先順序高,首先說明p是一個指針,指向一個整型的一維數組,這個一維數組的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型數據的長度。

如要將二維數組賦給一指針,應這樣賦值:

int a[3][4];

int(*p)[4];//該語句是定義一個數組指針,指向含4個元素的一維數組。

p=a;//將該二維數組的首地址賦給p,也就是a[0]或&a[0][0]

p++;//該語句執行過後,也就是p=p+1;p跨過行a[0][]指向了行a[1][]

(9)c語言指針數組擴展閱讀:

與數組指針關系

數組指針是指向數組首元素的地址的指針,其本質為指針(這個指針存放的是數組首地址的地址,相當於2級指針,這個指針不可移動);指針數組是數組元素為指針的數組,其本質為數組。

例如:*p[2]是指針數組,實質是一個數組,裡面的兩個元素都是指針,[]的優先順序比*的優先順序高,p先與[]結合,形成數組p[2],有兩個元素的數組,再與*結合,表示此數組是指針類型的,每個數組元素相當於一個指針變數

與二維數組對比

二維數組:如char string_1[10][10]只要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字元。我們可以通過指定下標對其元素進行修改。

指針數組:如char*str_B[5]系統至少會分配5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字元型數據的一個指針。

如果我做這樣的定義:

char a[3][8]={"gain","much","strong"};

char*n[3]={"gain","much","strong"};

他們在內存的存儲方式分別如右圖所示,可見,系統給數組a分配了

3×8的空間,而給n分配的空間則取決於具體字元串的長度。

此外,系統分配給a的空間是連續的,而給n分配的空間則不一定連續。

由此可見,相比於比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是訪問指針數組中的一個元素是用指針間接進行的,效率比下標方式要高。但是二維字元數組卻可以通過下標很方便的修改某一元素的值,而指針數組卻無法這么做。

舉例編輯

數組指針:

#include&lt;stdio.h&gt;

int main()

{

char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一個漢字=3個位元組

char(*p)[4];

int i;p=c;//將指針定位於c[0]

for(i=0;i&lt;=5;i++)

{

printf("%s,",*(p+i));//或者將*(p+i)替換成*p++

}

printf(" ");

for(i=5;i&gt;=0;i--)

{

printf("%s,",*(p+i));//或者將*(p+i)替換成*--p

}

return 0;

}

指針數組:

#include&lt;stdio.h&gt;

int main()

{

int i;

char*pch[6]={"妹","妹","你","坐","船","頭"};

for(i=0;i&lt;6;i++){

printf("%s,",pch&lt;i&gt;);

}

printf(" ");

for(i=5;i&gt;=0;i--){

printf("%s ",pch&lt;i&gt;);

}

return 0;

}

㈩ C語言指針數組指針怎樣理解

  • 指針數組,指數組元素就是指針

  • 數組指針,對於一維數組來說就是數組名

  • 故對於一維數組來說,數組名是第一個元素的指針,而元素本身也是指針,故數組名是指向指針的指針。

  • 例如:int*p=&a;int**q=&p;

  • 則p中儲存的是整形變數a的地址,而指針p自身也是變數(指針變數通常佔4個位元組),故q中儲存的就是變數p的地址。q就成了指向指針的指針。