1. 程式人生 > >[C]c語言中,scanf裡面要是陣列要不要加&?

[C]c語言中,scanf裡面要是陣列要不要加&?

先上一段程式碼給大家看下

#include<stdio.h>
int main(){
int a[100];
int n,i;
scanf("%d",&n);//輸入個數
for(i=0;i<n;i++)scanf("%d",&a[i]);//這裡也可以用 scanf("%d",a+i);
for(i=n-1;i>0;i--)printf("%d ",a[i]);
printf("%d\n",a[i]);
}

然後我解釋一下:
scanf傳得必須是指標,也就是地址。
比如int a;就需要&a;但是如果是陣列,陣列本身表示的是陣列首元素的地址。也就是int a[10]裡a就表示a[0]的地址;那a[3]的地址呢?可以這樣,&a[3]

;這就是加&的陣列,如果不加呢,可以這樣(a+3)就可以了,a是a[0]的地址,那麼a+3就是a[3]的地址。
所以陣列的scanf賦值是要加&的。
但是printf裡因為輸出的不是地址而是值所以不用加&。

為了更好的對對地址進行操作的函式的理解,我們再拿二維陣列解釋一下。
我有一個二維陣列st_edge** edge
我想讓當指標位置指向的不是每一行(維)的最後一個null節點時,讓指標在這個一維陣列中往後移動,直到移動到這一行的最後一個非null節點的下一個位置,那麼我可以

while(*edge != NULL){
      edge = &((*edge)
->
next); }

上面的意思即為當一維指標不指向null時,將指向二維陣列的指標指向一維指標(*edge)下一個地址的地址,即二維指標的地址,從而實現了二維指標的移動。