c 指標跟陣列的主要區別

2021-08-31 22:54:50 字數 1480 閱讀 1430

最近學習c++,看到《高質量c++/c程式設計指南》的記憶體分配那一章,講到陣列跟指標的區別,覺得有必要記錄一下,以便後檢視

指標跟陣列的區別主要有三個:

1:修改內容

陣列可以隨意修改其中某一項的內容,只要不超過陣列的邊界就可以了。而對於指向常量的指標則不可以進行修改,儘管從語法上進行修改並沒有什麼不妥,但是在執行會導致錯誤。另外說一點,對於越界操作的陣列跟指標,雖然結果是未知的,但是語法上卻是可以通過的

char a = "hello";

a[0] = 'x';

cout << a << endl;

char *p = "world";

p[0] = 'x';

cout << p << endl;

2:比較及賦值

對於陣列的比較,不能用類似的b==a,這樣就行賦值,二是要使用strcmp。對於陣列的複製,也不能使用類似b=a這樣的結構,而是要使用strcpy,否則將導致編譯錯誤。

對於指標與陣列的比較,p==a,比較的是二者的位址,而不是內容,內容要用strcmp進行比較。對於p=a,這樣的賦值,是把a的指標,也就是a[0]的位址,複製給p,而不是複製a的內容到p,如果要複製,可以用malloc申請一塊strlen(len)+1的字元大小的記憶體,再用strcpy進行賦值。

// 陣列...

char a = "hello";

char b[10];

strcpy(b, a); // 不能用 b = a; if(strcmp(b, a) == 0) // 不能用 if (b == a)

...// 指標...

int len = strlen(a);

char *p = (char *)malloc(sizeof(char)*(len+1)); strcpy(p,a); // 不要用 p = a; if(strcmp(p, a) == 0) // 不要用 if (p == a)

...

3:計算記憶體容量

可以用sizeof計算陣列占用的記憶體大小(位元組數),也可以用sizeof(a)/sizeof(a[0]),來計算陣列的大小,而對於指標sizeof(p),得到的則是乙個指標變數的位元組數,相當於sizeof(char*),一般為4.c++/c沒法知道指標所指向的記憶體容量,除非在申請時就記住他。

需要注意的一點是,當陣列作為函式的指標進行傳遞時,陣列自動退化為同型別的指標,因此無論陣列本身容量時多少,sizeof(a)始終等於sizeof(char *)

char a = "hello world";

char*p =a;

cout<< sizeof(a) << endl; // 12 位元組 cout<< sizeof(p) << endl; // 4 位元組

void func(char a[100])

C與C 主要區別

在很大程度上,標準c 是標準c的超集.實際上,所有c程式也是c 程式,然而,兩者之間有少量區別.下面簡要介紹一下最重要的區別.在c 中,民,區域性變數可以在乙個程式塊內在任何地方宣告,在c中,區域性變數必須在程式塊的開始部分,即在所有 操作 語句之前宣告,請注意,c99標準中取消了這種限制.在c中,...

陣列和集合的主要區別

儲存型別。陣列可以儲存基本資料型別和物件,集合只能儲存物件 長度。陣列的長度是固定的,集合的長度是可變的 定義。定義陣列時必須指定陣列元素型別,集合預設為object 元素個數。陣列不發直接獲取實際儲存元素個數,leng可以獲取陣列長度,集合可以通過size 獲取實際儲存元素個數 場合。陣列僅採用分...

C與C 的主要區別

1.建立的檔案型別不一樣 c語言是.c檔案,而c 語言是.cpp檔案 2.引入的標頭檔案不一樣 c語言標頭檔案一般是.h結尾的標頭檔案,c 語言標頭檔案在c基礎上的一般是cstdio檔案 3.c 存在命名空間 using namespace std 4.輸入與輸出的語句不一樣 c語言中 printf...