指標與陣列的異同

2021-09-09 00:19:17 字數 1652 閱讀 1260

在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為位址取得資料。通常用於動態資料結構 通常用於儲存固定數目且資料型別相同的元素。相關...