歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言數組和指針的不同

我們用幾個小實例來理解數組和指針的不同之處。

兩個文件

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