歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言數組和指針的不同

C語言數組和指針的不同

日期:2017/3/1 10:10:21   编辑:Linux編程
我們用幾個小實例來理解數組和指針的不同之處。

兩個文件

array_define.c

  1. char p[] = "i love you";
array_and_pointer.c
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. extern char *p;
  5. printf("%c\n",p[3]);
  6. return 0;
  7. }

編譯連接這兩個文件,並運行

gcc array_and_pointer.c array_define.c -o array_and_pointer

運行這個程序,會被系統中止

看下面的代碼

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. extern char *p;
  5. printf("%p\n",p);
  6. printf("%p\n",&p);
  7. printf("%c\n",p);
  8. return 0;
  9. }

我們發現,p這個指針的值是字符串,“i love you" 中的前4個字符,就是說,它他前四個字符作為自己指向的一個地址,所以第一個例子會出錯.

輸出的第二行,才是真正字符串"i love you"開始的地址。


再看下面的例子

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. extern char p[];
  5. printf("%p\n",p);
  6. printf("%p\n",&p);
  7. printf("%p\n",&p[3]);
  8. printf("%c\n",p[3]);
  9. return 0;
  10. }

從運行結果我們知道,p 和 &p 的內容是一樣的,也就是字符串開始的地址,所以對於數組來說,數組名可以說只是字符串首地址的別名,用數組名就等於用首地址。

運行結果的第三行是p[3] 也就是 ‘o’ 這個字符的地址。

從上面幾個例子可以知道,數組只是用了一個別名來代表數組的首地址。而指針,是存放了數組的首地址,通過指針訪問數組,進行了兩步,先訪問指針保存的數組首地址,再通過那個地址訪問數組。

現在回到第一個例子,如果我們就是想通過 extern char *p 來訪問數組怎麼辦?

看下面的例子

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. extern char *p;
  5. printf("%p\n",&p);
  6. printf("%c\n",*((char*)&p + 3));
  7. return 0;
  8. }

我們首先通過 &p 取出字符串的首地址,然後將這個地址強制轉換成一個char型指針(不知道這樣說對不對,如果不對,請大家一定指正),然後把它的偏移量加3,再取這個地址的內容,就可以訪問第三個字符了。

如果有不對的地方,請大家一定指正,謝謝。

Copyright © Linux教程網 All Rights Reserved