在c語言中對於下面的兩種情況,是否相同呢?
char a = "abcdefg";---------------1
char *p = "abcdefg";-----------------2
在談到這些區別時,應該先談一下計算機中對變數是如何儲存的。從編譯原理中我們知道,對於所有的變數他都會影射到乙個符號表中。為了簡化,這裡給出一種最簡單的便於理解的符號表:
a 0xffaa p
0xffcc
表1 乙個簡單的符號表示例
以上**中a代表乙個變數,0xffaa則為變數a的內容的儲存位址;p代表另乙個變數,0xffcc為變數p的內容的儲存位址。對於陣列型的變數和指標型的變數,其位址代表的含義不同。
對於陣列a:
這個0xffaa位址就是其存放陣列內容的首位址了。對於a[i]的引用步驟如下:
步驟一、取出i的值,將他與0xffaa相加;
步驟二、取出為(0xffaa+i)中的內容。
對於指標p:
這個0xffcc位址就是中存放的不是字串的內容,而是乙個位址,這個位址才是字串的首位址,對p[i]或者用指標表示*(p+i)的應用步驟如下:
步驟一、取出0xffcc位址中的內容,例如為0xffdf;
步驟二、取出位址0xffdf中的內容。
陣列和指標的對比如下圖:
下面是在vc6.0下作的乙個試驗,通過這個試驗大家可以看到,雖然同過和通過*引用都一樣,但在內部處理的方法是不一樣的。
#include "stdafx.h"
#include "stdio.h"
int main(int argc, char* ar**) ;
int *p =a;
printf("a:%d,&a:%d,a[0]:%d,*a:%d,p:%d,&p:%d,*p:%d,p[0]:%d",a,&a,
a[0],*a,p,&p,*p,p[0]);
return 0; }
輸出結果:
a:1310580,&a:1310580,a[0]:1,*a:1,p:1310580,&p:1310576,*p:1,p[0]:1。
由上面的分析可知,如果在乙個檔案中定義了乙個陣列int maychar[100],那麼下面的宣告就是完全錯誤的。
extern int *maychar;
這樣的話,在引用時他就會按照指標的方法來引用陣列。正確的宣告應該是exter int maychar;這裡陣列的大小並不重要。下面將指標與陣列的區別用**的形式列出如下:
指標 陣列
儲存資料的位址
儲存資料
間接訪問資料
直接訪問
通常用於動態資料結構
通常用於儲存固定數目資料型別相同的元素
相關操作malloc(),free()等
隱式分配和刪除
同常指向匿名資料
自身即為資料名
表2 指標與陣列的區別
還要提醒一點的就是:
char a = "abcdefg";---------------陣列內容能修改(字元陣列)
char *p = "abcdefg";-----------------內容不能修改(字串常量)
在ansi c中,初始化指標是所建立的字串時常量,被定義為唯讀,如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為。
指標與陣列的異同
在c語言中對於下面的兩種情況,是否相同呢?char a abcdefg 1 char p abcdefg 2 在談到這些區別時,應該先談一下計算機中對變數是如何儲存的。從編譯原理中我們知道,對於所有的變數他都會影射到乙個符號表中。為了簡化,這裡給出一種最簡單的便於理解的符號表 a 0xffaa p ...
陣列與指標的異同
我們定義乙個陣列和指標 int arry 0,4 7,8 int ptr ptr arry 或者ptr arry 0 首先我們要先了解一些概念 0.陣列實際上是指標的變相形式 1.指標的數值就是它指向的物件的位址 2.在指標前運用運算子 就可以得到該指標所指向物件的數值 如 ptr 0 ptr 1 ...
c語言 陣列與指標的異同
指標 陣列儲存資料的位址 儲存資料 間接訪問資料,首先取得指標的內容,把它作為位址,然後從這個位址提取資料。如果指標有乙個下標 i 就把指標的內容加上i作為位址,從中提取資料。直接訪問資料,a i 只是簡單的以a i為位址取得資料。通常用於動態資料結構 通常用於儲存固定數目且資料型別相同的元素。相關...