2017-01-14 83 views
0

看來,我不知道實際上 char *(arr[5])char (*arr)[5] 之間的差在邏輯上,因爲它與類型定義,char *(arr[5])是一個指向數組的指針,char *arr[5]char指針的數組,那麼(*arr)[5]會是什麼呢?或者它沒有區別?差(ARR [5])和炭(* ARR)[5]


我做了一些測試,發現這3個聲明是不同的。 例如,如果我使用char (*arr)[5]它完全允許我這樣做arr = malloc(2),否則它呻吟非法轉換。


有人能解釋這些聲明之間的差異,當使用它們,這將是一個巨大的加號,如果這也包括可能我做arr = malloc(2)動態分配[5]字符數組,因爲它讓我在使用char (*arr)[5]時雖然給我堆棧溢出,但在語義上這樣做。 (免責聲明:[]表明堆棧分配,因此它並沒有多大意義,因爲堆內存地址不能指向只要我不知道堆棧存儲器地址)

+4

'字符(* ARR)[5]'是一個指向5'char's一個數組...我想'字符*( arr [5])'只是一個指向'char'的5個指針的數組,與沒有括號相同? – Dmitri

+0

@Dmitri真是有道理,但EiC c解釋器找到他們的不同。這是我困惑的地方。 – Malina

+2

'char(* arr)[5]'和'char *(arr [5])* * *是不同的。它是'char *(arr [5])'和'char * arr [5]',我認爲它們是相同的。 – Dmitri

回答

0

char *(arr[5])等於char *arr[5],它意味着你有它們每個指向一個字符的指針數組,因此arr[0]可以指向一個字符並且arr[1]可以指向一個字符等等。 例如,你可以寫你這樣的代碼:

char *(arr[5]);// or char *arr[5] 
char a = 'a',b='b',c='c'; 
arr[0] = &a; 
arr[1] = &b; 
arr[2] = &c;  
printf("a=%c b=%c c=%c \n",*arr[0],*arr[1],*arr[2]); 

(*arr)[5]意味着你有5個字符數組,你想點吧。
例如,你可以寫你這樣的代碼:

char (*arr)[5]; 
char str[5] = "Hell"; 
arr = &str; 
printf("%s\n",*arr); 
相關問題