我是C編程和學習指針的新手。看看下面的程序。函數中* p和(* p)[3]之間的區別是什麼?
第一程序
#include<stdio.h>
int fun();
int main()
{
int num[3][3]={21,325,524,52,0,6514,61,33,85};
fun(num);
printf("%d",*(*(num+1)+1));
*(*(num+1)+1)=0;
printf("%d",*(*(num+1)+1));
return 0;
}
int fun(int **p)
{
*(*(p+1)+1)=2135;
return 0;
}
第二程序
#include<stdio.h>
int fun();
int main()
{
int num[3][3]={21,325,524,52,0,6514,61,33,85};
fun(num);
printf("%d",*(*(num+1)+1));
*(*(num+1)+1)=0;
printf("%d",*(*(num+1)+1));
return 0;
}
int fun(int *p)
{
*((p+1)+1)=2135;
return 0;
}
第三程序
#include<stdio.h>
int fun();
int main()
{
int num[3][3]={21,325,524,52,0,6514,61,33,85};
fun(num);
printf("%d",*(*(num+1)+1));
*(*(num+1)+1)=0;
printf("%d",*(*(num+1)+1));
return 0;
}
int fun(int (*p)[3])
{
*(*(p+1)+1)=2135;
return 0;
}
- 在第一個程序中
**p
用於fun()
函數,我認爲它應該是正確的,並且在那個函數中我寫了*(*(p+1)+1)
來改變第一個數組的第一個元素。但是在編譯這個程序時它顯示了error: invalid type argument of unary '*' (have 'int')
。據我所知,num是一個指向數組的指針,它保存着num[1]
的地址,該地址再次持有地址num[1][0]
。 - 在編譯第二個程序編譯器時顯示沒有錯誤。而
*((p+1)+1)=0
正在改變第一個數組的第二個元素的值。爲什麼它正在改變第二個數組的第二個元素的值而不是第一個數組的第一個元素的值?如何?它應該是*(*(p+1)+1)=0
。 - 在第三個程序中,compler顯示沒有錯誤,並顯示正確的結果。怎麼樣?。
*(p)[3]
是什麼意思?
我已經搜索了這個,但沒有找到滿意的結果。
請刪除所有出現的「+0」,然後是所有不必要的大括號。他們沒有用,並導致嚴重的頭痛。 – fjf2002 2014-12-03 21:32:02
數組的名稱是指向數組的第一個元素的指針。也許在內部它不是真的一樣,但你可以用它作爲指針。 – Joachim 2014-12-03 21:40:23
我編輯了這個問題。 :) – 2014-12-03 21:49:15