1. 程式人生 > >C語言中陣列與指標的區別

C語言中陣列與指標的區別

本文是對《C語言深度剖析》一書內容的拓展,在看這本書的時候解了很多我之前的一些困惑,故在此記錄。對陣列的引用總是可以寫成對指標的引用,而且確實存在一種指標和陣列的定義完全相同的上下文環境。

但是指標和陣列還是在本質上是不一樣的。指標就是指標,指標變數在32位的系統下面是4Byte,而在64位系統下面是8Byte,其值為某一個記憶體的地址。而陣列就是陣列,其大小與元素的型別和個數有關,定義陣列時必須制定其元素的型別和個數,陣列可以存放任何型別的資料,但是不能存放函式。

1、從變數大小來看指標與陣列的區別

#include<stdio.h>

int main(){
	char *p = "abcdef";
	char a[] = "abcdef";
	int b[] = {1,2,3,4,5};
	int *ptr = (int*)(&b+1);
	printf("sizeof(p) = %d;\n",sizeof(p));
	printf("sizeof(a) = %d;\n",sizeof(a));
	printf("*(b+1) = %d,*(ptr - 1) = %d;\n",*(b+1),*(ptr-1));	
	return 0;
}

上面的演示程式中,對於指標p的求值是p這個指標的大小,由於測試的作業系統是64位的,所以是8;而對於陣列a,它的值就是這個陣列的大小了。

後面對於b這個陣列,*(b+1)=2非常好理解,其實就相當於b[1];而後者為什麼是這樣的?(&b+1)其實是取b的首地址,該地址的值加上sizeof(b)的值,即&b+5*sizeof(int),也就是下一個陣列的首地址的,顯然現在的指標已經越界了。將前者的值賦給ptr,則此時ptr指向的是b[5],在此基礎上減一,就是b[4]了,即5。

2、指標陣列與陣列指標

指標陣列:首先它是一個數組,這個陣列全是指標,陣列佔用多少個位元組有陣列本身決定。它是“儲存指標的陣列

”的簡稱。

陣列指標:首先它是一個指標,它指向一個數組。在32位系統下永遠佔用4個位元組,至於它指向的陣列佔多少個位元組,不知道。它是“指向陣列的指標”的簡稱。

如下所示,前者的指標陣列,後者是陣列指標。

Int *p1[10];

Int (*p2)[10];

如何區分,前者的話[]比*號的優先順序要高,所以其一定先是陣列,然後才是指標,合起來就是指標陣列了。後者也是一個符號優先順序的問題,看到(),毫無疑問了。它們的圖示如下。