[英]passing array pointer to function in C
在我的main()
函數中,我初始化數組指針*AD
並使用for循環將數組A[5]
的地址復制到指針AD[5]
。 當我將此指針AD
傳遞給函數row1()
並將其所有值(在AD中)分配給I[5]
我得到的是A[5]
的實際值而不是地址。 另一方面,當我在main()
打印AD[5]
指針的值時,我得到了地址。 我正在使用DEV c ++編譯器。
為什么在函數中我得到真實的價值?
#include <stdio.h>
int main(void)
{
int test;
int A[5];
int *AD[5];
FILE *fpc;
fpc=fopen("testing.txt","r");
fscanf(fpc,"%d",&test);
int i;
for(i=0;i<test;i++)
{
int j;
for(j=0;j<5;j++)
{
fscanf(fpc,"%d",&A[j]);
AD[j]=&A[j];
printf("%d ",AD[j]);
}
puts("");
row1(AD[0]);
}
}
void row1 (int AD[0])
{
int I[5];
int i;
for(i=0;i<5;i++)
{
I[i]=AD[i];
AD[i]=AD[i]+1;
printf("%d, ",I[i]);
}
puts("");
puts("");
puts("");
puts("");
}
如果要傳遞一個指針數組,則函數聲明及其調用將類似於
void row1 (int *AD[] );
//...
row1( AD );
考慮到必須在調用函數之前聲明該函數。
至於功能本身,則不清楚您要在功能內實現什么。
同樣因為數組AD是指針數組,所以您應該在printf函數中使用格式說明符%p
printf("%p ",AD[j]);
聲明...
int *AD[5];
...聲明AD
為五個指向int
指針的數組。 您可以使用指向A
的相應成員的指針來初始化每個成員(這看起來很浪費,但是不管用什么)。
您稍后執行此調用:
row1(AD[0]);
很好:它將AD
的第一個元素傳遞給函數。 由於AD[0]
是指向A[0]
的指針,所以它們等效於以下任意一個:
row1(&A[0]);
/* or */
row1(A);
特別要注意后者。
現在,函數row()
的聲明如下:
void row1 (int AD[0])
這似乎將函數參數AD
聲明為一個零個int
s的數組,這將是無效的,但實際上,函數參數聲明中的數組長度會被忽略。 該聲明等效於以下任何一個:
void row1 (int AD[])
/* or */
void row1 (int *AD)
這是與你逝去的說法一致,但要注意, AD
的功能row1()
是區別於AD
中main()
他們有不同的和不兼容的類型 。
在功能row1()
您有...
I[i]=AD[i];
...您將值由指針指向 AD + i
。 設置方式的方式,可以得出可以在main()
表示為A[i]
的值。
如果確實要打印指針本身的表示形式,則可以在row1()
這樣做,如下所示:
int i;
for (i = 0; i < 5; i++) {
printf("%p, ", AD++);
}
請注意,它是指針本身被打印,而不是它所指的東西。 還請注意,這取決於它的正確性,取決於main()
初始化(其) AD
。
另外,您可以像這樣重寫row1()
:
void row1 (int *AD[])
{
int i;
for(i = 0; i < 5; i++)
{
printf("%p, ", AD[i]);
}
}
然后從main()
調用它,如下所示:
row1(AD);
請注意,您傳遞的是整個數組,而不僅僅是單個元素。 如果您不能依靠main()
的AD
成員作為指向數組中連續成員的指針,那是唯一的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.