前言 數(shù)組與指針是不等價(jià)的,如:
區(qū)別一 數(shù)組名的指向不可以改變,而指向數(shù)組的指針是可以改變的。 請(qǐng)看如下代碼: #include <stdio.h> 數(shù)組遍歷方式一:使用指針遍歷數(shù)組元素,*p++等價(jià)于*(p++),即指針指向的地址每次后移一個(gè)單位,然后再取地址上的值。這里的一個(gè)單位是sizeof(int)個(gè)字節(jié),至于為什么是sizeof(int)個(gè)字節(jié)可以查閱我的總結(jié)C語言指針變量的運(yùn)算。 數(shù)組遍歷方式二:使用數(shù)組名自增遍歷數(shù)組元素,編譯出錯(cuò),錯(cuò)誤如下: error: value required as increment operand 因?yàn)閿?shù)組名的指向是不可以改變的,使用自增運(yùn)算符自增就會(huì)改變其指向,這是不對(duì)的,數(shù)組名只能指向數(shù)組的開頭。但是可以改為如下遍歷方式: for ( i = 0; i < 5; i++ ) 這可以正確遍歷數(shù)組元素。因?yàn)?(a+i)與a[i]是等價(jià)的。 區(qū)別二 字符串指針指向的字符串中的字符是不能改變的,而字符數(shù)組中的字符是可以改變的。 請(qǐng)看如下代碼: //字符串定義方式一 字符串定義方式一:字符串中的字符是可以改變的。如可以使用類似str[3]='q'這樣的語句來改變其中的字符。原因就是:這種方式定義的字符串保存在全局?jǐn)?shù)據(jù)區(qū)或棧區(qū),是可讀寫的。 字符串定義方式二:字符串中的字符是不可以改變的。原因就是:這種方式定義的字符串保存在常量區(qū),是不可修改的。 具體可查閱:char *str與char str[]的區(qū)別 PS:關(guān)于C內(nèi)存內(nèi)存的總結(jié)可查閱我的總結(jié):通俗易懂的C語言內(nèi)存總結(jié) 區(qū)別三
請(qǐng)看如下代碼: #include <stdio.h> 運(yùn)行結(jié)果 方式一:len=5 方式二:len=1 求數(shù)組長(zhǎng)度方式一:借用數(shù)組名來求數(shù)組長(zhǎng)度,可求得數(shù)組有5個(gè)元素,正確。 求數(shù)組長(zhǎng)度方式二:借用指針求數(shù)組長(zhǎng)度,求得長(zhǎng)度為1,錯(cuò)誤。原因是: p只是一個(gè)指向int類型的指針,編譯器不知道其指向的是一個(gè)整數(shù)還是指向一個(gè)數(shù)組。sizeof(p)求得的是p這個(gè)指針變量本身所占用的字節(jié)數(shù),而不是整個(gè)數(shù)組占用的字節(jié)數(shù)。 以上就是指針與其指向的數(shù)組的三個(gè)典型的區(qū)別:(1)遍歷數(shù)組時(shí)需要注意;(2)修改字符串中的字符時(shí)需要注意;(3)求數(shù)組長(zhǎng)度時(shí)需要注意。 推 薦 閱 讀 【常見】getchar()、getche()、getch()的區(qū)別? 【易錯(cuò)】char *str與char str[]的區(qū)別? 【知識(shí)點(diǎn)】來看一看volatile關(guān)鍵字 【知識(shí)點(diǎn)】C語言變量默認(rèn)的初值是? 【每日一句】 塑造自己的過程很疼,但最終你能收獲一個(gè)更好的自己。 |
|