91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

指針與數組的比較

發布時間:2020-07-17 13:20:56 來源:網絡 閱讀:356 作者:巖梟 欄目:編程語言

     C++/C 程序中,指針和數組在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。

     數組要么在靜態存儲區被創建(如全局數組) ,要么在棧上被創建。數組名對應著(而不是指向)一塊內存,其地址與容量在生命期內保持不變,只有數組的內容可以改變。指針可以隨時指向任意類型的內存塊,它的特征是“可變” ,所以我們常用指針來操作動態內存。指針遠比數組靈活,但也更危險。

下面以字符串為例比較指針與數組的特性

1.修改內容

    示1中,字符數組a的容量是6個字符,其內容為 hello\0 的內容可以改變,如 a[0]=X’。指針指向常量字符串“world ” (位于靜態存儲區,內容為 world\0) ,常量字符串的內容是不可以被修改的。從語法上看,編譯器并不覺得語句 p[0]=X’有什么不妥,但是該語句企圖修改常量字符串的內容而導致運行錯誤。

示例1

char a[] ="hello";

a[0] ='X';

cout<<a<<endl;

char *p = "world"// 注意p指向常量字符串

p[0] = 'X'// 編譯器不能發現該錯誤

cout<<p<<endl;

2.內容復制與比較

    不能對數組名進行直接復制與比較。2中,若想把數組a的內容復制給數組,不能用語句b = a ,否則將產生編譯錯誤。應該用標準庫函數st rcpy 進行復制。

    同理,比較ba的內容是否相同,不能用 i f ( b==a) 來判斷,應該用標準庫函數st rcmp進行比較。語句p = a并不能把a的內容復制指針,而是把a的地址賦給了。要想復制 a的內容,可以先用庫函數mal loc p申請一塊容量為st r l en( a) +1 個字符的內存,再用strcpy進行字符串復制。同理,語句i f ( p==a) 比較的不是內容而是地址,應該用庫

函數st rcmp來比較。

示例2

// 數組

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(strcm(p,a) == 0) // 不要用if(p == a)

3.計算內存容量

     用運算符sizeof可以計算出數組的容量(字節數)。3中, si zeof ( a)的值是12 (注意別忘了’\ 0’) 。指針p指向a但是si zeof ( p)的值卻是 4  。這是因為si zeof ( p) 得到的是一個指針變量的字節數,相當于 si zeof ( char *) ,而不是所指的內存容量。

注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。3中,不論數組的容量是多少,sizeof(a)始終等于sizeof ( char *)  

示例3

char a[] = "hello world";

char *p = a;//*p是指針變量

cout<<sizeof(a)<<endl; // 12字節

cout<<sizeof(p)<<endl; // 4字節

 

void Func(char a[100])

{

cout<<sizeof(a)<<endl; // 4字節而不是100字節

}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉尔市| 磐石市| 建水县| 颍上县| 天气| 平南县| 莱西市| 通许县| 灌南县| 荥阳市| 元氏县| 咸宁市| 化德县| 西峡县| 抚宁县| 东港市| 桐柏县| 德令哈市| 浦东新区| 察隅县| 涟水县| 增城市| 通道| 平塘县| 石家庄市| 锡林郭勒盟| 佳木斯市| 寻乌县| 怀宁县| 衢州市| 通化县| 长白| 万盛区| 西华县| 瑞昌市| 江山市| 舟曲县| 通城县| 翼城县| 宜良县| 潜山县|