作者DEATHX (幽光)
看板C_and_CPP
標題Re: [問題] 指標與陣列宣告?
時間Sat Nov 26 08:29:08 2011
※ 引述《thank1984 (把握當下)》之銘言:
: 問題(Question):
: #define COLS 60;
: 宣告方式1: char *ptr[COLS];
: 宣告方式2: char (*ptr)[COLS];
: 宣告方式3: char *(ptr)[COLS];
: 我想請問各位大大上面這三種宣告方式有什麼差別嗎 小弟搞不太清楚這之間的關係
: 麻煩各位大大解答 謝謝
我也搞不懂,查了一下google,未見實際用法?
在Cprograming.com上看了一篇討論,最後也沒有人跳出來解釋用法
我下面試了一個例子,work,所以略述我所見:
/**************************************/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char (*pname)[10];
char name[10] = "123456789";
pname = &name;
printf("\n%c\n",*(name + 3));
printf("\n%c\n",*(*(pname) + 3));
return 0;
}
/************************************/
執行結果:
smalldick@smalldick-laptop ~ $ gcc -o a.out pointer_array.c && ./a.out
4
4
/************************************/
大概是這樣
pname 是存name這個陣列起始元素位址的位址
而name是存name陣列起始第一個元素的位址
所以在操作pname的時候才要反參考兩次.
ps:我後面把name改成name[15] = "1234567890abcd";
結果pname還是可以指向name,不過gcc在編譯的時候會報warning,但是還是會動.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.161.187.250
→ EdisonX:char name[2][5]={"ab","cd"}, char *p=name; 11/26 09:54
→ EdisonX:puts(p), ++p, puts(p); 這本來就不多情況會用到. 11/26 09:55
→ purincess:報warning還是會動的意思就是代表有的時候就不會動了XD 11/26 18:07
→ loveme00835:為什麼你要用'數值'來思考呢?把array當成一整體不好嗎 11/26 19:44
→ loveme00835:硬是要把他割成好幾部分... 11/26 19:47
→ DEATHX:樓上說得是^.^ 但是a[10]跟b[20]兩者我就是覺得無法比較 11/26 21:56
推 Bencrie:這帳號跟 hostname 真糟糕 XDD 11/27 17:30