指針引用數組
A. C語言用指針引用數組元素
(*p)[3]是定義一個指向一維數組的指針,數組元素為三。也就是說p指向的其實是a[0],a[1],a[2]這樣的形式。
p=a;其實就是把第0行的首地址賦值給p.
所以答案C中p[1]即是把第1行的首地址給p,在此基礎上向後移一位,取出地址中的元素數值。 *(p[1]+1)相當於a[1][1].所以是對的。
B的形式是對的,但是它相當於a[2][1],超出界限所以為錯。剩下的兩個格式就不對。
B. 用指針引用二維數組元素
a 是數組首地址,等於 &a[0][0].
*p 聲明裡是指針。語句里 *p 是 指針指向的值。 語句里 p 是地址.
*p 是1個星號的指針,可以讓它指向1維數組,也可以讓有序地它指向2維數的各元素。
int a[行][列]; a[j][i] 數組元素排列 是:
第一行 的 第1列,第二列,第三列....
第二行 的 第1列,第二列,第三列....
第三行 的 第1列,第二列,第三列....
2維數可以看成1維數組,排成1字長蛇陣:第一行 的 第1列,第二列,第三列..;
第二行 的 第1列,第二列,第三列....;。。。。直到最後一行最後一列。
#define row 3
#define col 4
int a[row][col]; // 某一元素: a[j][i]
int *p,i,j;
排成1字長蛇陣後,一維下標,可以用二維 下標計算: j*col + i.
某一元素: a[j][i] 的 數值 就是 * (p+j*col+i);
----
寫出完整程序,依次輸出所有元素,對比:
#include <stdio.h>
main()
{
#define row 3
#define col 4
int a[row][col] = { 0,1,2,3,4,5,6,7,8,9,10,11};
int *p;
int i,j;
p=&a[0][0];
for (j=0;j<row;j++){
for (i=0;i<col;i++) printf("%2d ",a[j][i]);
printf("\n");
}
printf("===========\n");
for (j=0;j<row;j++){
for (i=0;i<col;i++) printf("%2d ", *(p+j*col+i));
printf("\n");
}
return 0;
}
======
如果 是 int **p; 才有 *(*(p+i)+j))形式。
對應 a[j][i], 指向的值 是 *(*(p+j) + i)
C. 通過指針引用數組元素
[0]是首地址, &a[0][0]+3*1+2是首地址後面第五個元素,也就是a[1][2]
不能 p=a 這樣賦值,p是int*[2]類型,a是int[2][3]類型 類型不同不能賦值
int a[2][3]是申請的一個連續地址,而*p[2]是一個指針數組,如果你能把每一行的首地址賦給這個指針數組的話,可以這么使用。但是如果只是給首地址賦值的話,此時這個指針數組的第二個元素,也就是第二行的首地址為一個隨意地址,沒有意義,不是連續的,所以不能實現*(p+3*1+2)來表示a[1][2]
D. 指針、數組名、引用三者的相同點與區別
上面一些說的太多,但重點沒說;
1.指針:存放變數的地址的變數;
2. 數組名: 是一個常量類型的指針,這是與「指針」變數的最主要區別;
3.引用:用「地址」直接表示一個變數的手段,而指針是間接表示一個變數;
-----------------------------
!!!!!!!!!!!!!!!!
樓主連貼也不看了、也不結了,太忙了吧
E. 指針、引用、數組的對比
指針:儲存變數地址的變數,可以被計算、賦值!
引用:基本相當於常量指針,不能計算,可以初始化一次!寫法上和變數沒區別!
數組(名):可以參加計算,但不能被賦值(這一點我也記不大清楚,好像是這樣!)
F. c語言指針變數引用數組
"i love china!"
"i am a student!"
這兩個都是常量字元串,存儲在 靜態存儲區 ,不容修改。
G. 通過指針數組引用數組元素
*(&a[0][0]+3*1+2) &a[0][0]是首地址, &a[0][0]+3*1+2是首地址後面第五個元素,也就是a[1][2]
不能 p=a 這樣賦值,p是int*[2]類型,a是int[2][3]類型 類型不同版不能賦權值
int a[2][3]是申請的一個連續地址,而*p[2]是一個指針數組,如果你能把每一行的首地址賦給這個指針數組的話,可以這么使用。但是如果只是給首地址賦值的話,此時這個指針數組的第二個元素,也就是第二行的首地址為一個隨意地址,沒有意義,不是連續的,所以不能實現*(p+3*1+2)來表示a[1][2]
H. c語言中,通過指針引用數組元素使用方法誰總結出來了
指針就是數組首地址,比如
int X=【5】;
int *p=X;
那麼你要引用X[3](第4個)就是*(p+3)(這是存儲的內容,一個存在X[3]內的值)
p+3,就是符號X[3]的地址
I. 初學C語言指針引用數組元素,很簡單的原理沒搞清,謝謝回答。
首先:
4個位元組 = 32 bit = 32 位二進制位, 你說的很對。
還有, 在開始解釋這個問題前, 我想先做幾個規定, 方便解釋:
我規定:
a 是數組的首地址, a = 0x00 , a 的地址是 0
那麼, 我要開始解釋你的問題了。
a + 1 中的 1 並不是 4 個位元組的意思, 按道理 a + 1 應該等於 0x01 , 因為 a 的是數組的首地址, 它的值是 0. 但是編譯器知道 a 是int類型的數組的首地址, 所以他會自作主張的做出如下的轉換: (a+1) -> (a+1*4) , 其中的 4 就是 int 類型的大小, 如果 int 類型是 8 個位元組的話, 這個轉換就是 (a+1) -> (a + 1*8).
解釋完了, 如果還有疑問, 歡迎追問
J. 「用指針引用數組元素」是什麼意思
就是說通過指針來訪問數組,例如有一個指針int *p和一個數組int a[4][2]。如果p=&a則有*p=a[0][0],*(p+1)=a[0][1],*(p+2)=a[1][0]。。專。。指針就是一屬個地址,操作起來會比數組效率高,但是這也在無形中給使用者增加了難度。