-
指針數(shù)組和數(shù)組指針的區(qū)別:
數(shù)組指針(也稱行指針)
定義 int (*p)[n];
()優(yōu)先級高,首先說明p是一個指針,指向一個整型的一維數(shù)組,這個一維數(shù)組的長度是n,也可以說是p的步長。也就是說執(zhí)行p+1時,p要跨過n個整型數(shù)據(jù)的長度。在32 位系統(tǒng)下任何類型的指針永遠(yuǎn)是占4 個字節(jié)。即數(shù)組指針永遠(yuǎn)占4個字節(jié)。
如要將二維數(shù)組賦給一指針,應(yīng)這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義一個數(shù)組指針,指向含4個元素的一維數(shù)組。
?p=a;??????? //將該二維數(shù)組的首地址賦給p,也就是a[0]或&a[0][0]
?p++;?????? //該語句執(zhí)行過后,也就是p=p+1;p跨過行a[0][]指向了行a[1][]所以數(shù)組指針也稱指向一維數(shù)組的指針,亦稱行指針。
指針數(shù)組
定義 int *p[n];
[]優(yōu)先級高,先與p結(jié)合成為一個數(shù)組,再由int*說明這是一個整型指針數(shù)組,它有n個指針類型的數(shù)組元素。這里執(zhí)行p+1時,則p指向下一個數(shù)組元素,這樣賦值是錯誤的:p=a;因?yàn)閜是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指針變量可以用來存放變量地址。但可以這樣 *p=a; 這里*p表示指針數(shù)組第一個元素的值,a的首地址的值。數(shù)組占多少個字節(jié)由數(shù)組本身的大小決定,每一個元素都是一個指針。
如要將二維數(shù)組賦給一指針數(shù)組:
int *p[3];
int a[3][4];
p++;?//該語句表示p數(shù)組指向下一個數(shù)組元素。注:此數(shù)組每一個元素都是一個指針
for(i=0;i<3;i++)
p[i]=a[i]
這里int *p[3] 表示一個一維數(shù)組內(nèi)存放著三個指針變量,分別是p[0]、p[1]、p[2]
所以要分別賦值。這樣兩者的區(qū)別就豁然開朗了,數(shù)組指針只是一個指針變量,似乎是C語言里專門用來指向二維數(shù)組的,它占有內(nèi)存中一個指針的存儲空間。指針數(shù)組是多個指針變量,以數(shù)組形式存在內(nèi)存當(dāng)中,占有多個指針的存儲空間。
還需要說明的一點(diǎn)就是,同時用來指向二維數(shù)組時,其引用和用數(shù)組名引用都是一樣的。
比如要表示數(shù)組中i行j列一個元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]優(yōu)先級:()>[]>*
查看全部 -
*p是指指針p的內(nèi)容,p是指指針p所指的地址,*p=&a;是指p此時的內(nèi)容換成a的值。p++;p+=3;都是指針的偏移,p+=3;不是地址+3,而是地址往下數(shù)3個格,即根據(jù)這個指針的數(shù)據(jù)類型確定每個格的字節(jié)數(shù)。如果p是int,那么每個格就是4個字節(jié)。
同時,還可以用p[0]、p[1]、p[2]、p[3]、p[4]、p[5]等代替,省去了指針的偏移。
查看全部 -
棧:先進(jìn)后出,后進(jìn)先出。由高地址向低地址放入,先放入的后出,后放入的先出。
先放入的分配的內(nèi)存大于后放入的。
字節(jié)順序是指占內(nèi)存多于一個字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序,通常有小端、大端兩種字節(jié)順序。小端字節(jié)序指低字節(jié)數(shù)據(jù)存放在內(nèi)存低地址處(由右向左),高字節(jié)數(shù)據(jù)存放在內(nèi)存高地址處;大端字節(jié)序是高字節(jié)數(shù)據(jù)存放在低地址處,低字節(jié)數(shù)據(jù)存放在高地址處(由左向右)。
示例中的Linux棧內(nèi)用的就是小端存儲(as高字節(jié)存放高地址,由上到下)。
查看全部 -
堆棧段:
1. 為函數(shù)內(nèi)部的局部變量提供存儲空間。
2. 進(jìn)行函數(shù)調(diào)用時,存儲“過程活動記錄”。
3. 用作暫時存儲區(qū)。如計(jì)算一個很長的算術(shù)表達(dá)式時,可以將部分計(jì)算結(jié)果壓入堆棧。
數(shù)據(jù)段(靜態(tài)存儲區(qū)):
包括BSS段(Block Started by Symbol)的數(shù)據(jù)段。BSS段存儲未初始化或初始化為0的全局變量、靜態(tài)變量,具體體現(xiàn)為一個占位符,并不給該段的數(shù)據(jù)分配空間,只是記錄數(shù)據(jù)所需空間的大小。數(shù)據(jù)段存儲經(jīng)過初始化的全局和靜態(tài)變量。
查看全部 -
64位計(jì)算機(jī):指針占8位字節(jié),變量占4位字節(jié)
查看全部 -
數(shù)據(jù)段在代碼段之上,所以可以在代碼基礎(chǔ)上改變數(shù)據(jù),數(shù)據(jù)段的內(nèi)存會把相同類型的數(shù)據(jù)存在一起,即整形變量存一起,整形指針存一起。32位計(jì)算機(jī)是隔四個字節(jié)存一個,即0x7fffffffddfc-0x7fffffffddff, 0x7fffffffde00-0x7fffffffde04。
查看全部 -
變量的本質(zhì)是內(nèi)存,指針的本質(zhì)是地址。
例:變量就是給柜子格(內(nèi)存)起名;指針就是在柜子格里放入的地址名,根據(jù)這個地址名找到實(shí)體。
查看全部 -
一、指針:int *p; *p 表示所指向的內(nèi)存空間的值; p 是所指向內(nèi)存空間的內(nèi)存首地址; &p 是指p指針變量在內(nèi)存中的地址; 二、指針的操作 當(dāng)聲明一個指針后未進(jìn)行初始化時,他所指向的內(nèi)存地址并不受我們控制,直接使用可能造成其他程序的穩(wěn)定性或自己本身程序的穩(wěn)定性。這就是大家常說的 "野指針"。 用 malloc、calloc、realloc 函數(shù)給指針內(nèi)存分配的空間,使用完畢用free釋放內(nèi)存后要講指針變量置為NULL,防止出現(xiàn)野指針的情況。 指針偏移運(yùn)算:p++、p+=1、p[n] 將指針位置移動所指向的位置,移動的步長與指針指向的具體數(shù)據(jù)類型有關(guān),如在32 bit系統(tǒng)中,int a=1; int * p=&a,如果a的地址為0x7fffffffde14,則p++后 p所指向的內(nèi)存地址為 0x7fffffffde18,步長為4,64 bit系統(tǒng)中將是 8。 三、字符數(shù)組:char str[] = " this is str"; 字符數(shù)組溢出問題,此時str長度應(yīng)為11,如果此時使用 scanf("%s",str); 輸入了超過11個字符的數(shù)據(jù),此時超過該數(shù)組長度的數(shù)據(jù)將會按順序覆蓋掉內(nèi)存地址的值,這樣可能會導(dǎo)致嚴(yán)重的問題 如一些系統(tǒng)安全、數(shù)據(jù)安全、當(dāng)前程序穩(wěn)定性或其他程序穩(wěn)定性。查看全部
-
字符串以\0結(jié)束?
hell\0? 以字符串輸出%s? hell? ? 以字符輸出%c hello? ?
\0不輸出,換行就空行
查看全部 -
char str3[10];
scanf("%s",str3);
scanf("%s",str1);可以寫會覆蓋
scanf("%s",str2);指針不能寫
str2內(nèi)是world以及world的地址,world存在代碼段,代碼段不能被程序員更改
查看全部 -
int類型的指針每次加4個字節(jié)
p++內(nèi)存地址往下移一格
p+=3? ?*p=101;? ? ? p[3]=101;? ? 內(nèi)存地址往下移3格
int *p=array;? array是指針常量
查看全部 -
數(shù)組長度為常量,每一次定義的數(shù)組空間是固定的,聲明的地址空間連續(xù)排放
x/3d 0x7ffffffffffffde14? ?從0x7ffffffffffffde14開始按10進(jìn)制輸出3個地址的內(nèi)容,間隔4字節(jié)
查看全部 -
指針指向代碼段系統(tǒng)默認(rèn)調(diào)用函數(shù)
* 指針->指針指向的地址的內(nèi)容
查看全部 -
先進(jìn)后出,最先進(jìn)入的函數(shù)在最下面,最先進(jìn)入的函數(shù)地址越小
數(shù)據(jù)段代碼段越往后聲明的地址越大
棧越往后聲明的地址越小,棧頂向下分配
靜態(tài)變量在每個函數(shù)間都不互相影響,是獨(dú)立變量。一個函數(shù)內(nèi)的靜態(tài)變量不管函數(shù)運(yùn)行多少次都在同一位置改動
全局變量被所有的代碼使用時都在同一地址處改動,相互影響,是唯一的變量
靜態(tài)變量,常量,全局變量都在數(shù)據(jù)段
查看全部 -
1個字節(jié)8位
1個整型32位,4個字節(jié)
a的地址是4個字節(jié)的首地址
ddfc ddfd? ddfe? ddff
內(nèi)存地址最大值0X7FFFFFFFFFFF
32位指針4個字節(jié),64位指針8個字節(jié)
編譯器優(yōu)化會把同一類型的變量聲明放到一起
查看全部
舉報(bào)