C指針
指針和內(nèi)存
1.指針的聲明
指向未初始化的內(nèi)存的指針可能會產(chǎn)生問題。如果將這種指針解引,指針的內(nèi)容可能并不是一個合法的地址,就算是合法地址,那個地址也可能沒有包含合法的數(shù)據(jù)
//聲明一個指針
int num;
int *pi;
2.如何閱讀聲明
3.地址操作符(&)
//地址操作符&返回操作數(shù)的地址,可用地址操作符初始化指針
num = 0;
pi = #
4.打印指針的值
//顯示pi的地址和內(nèi)容,pi的內(nèi)容時num的地址
printf("Address of pi: %d Value: %d\n",&pi, pi);
printf("Address of pi: %x Value: %x\n",&pi, pi);
printf("Address of pi: %o Value: %o\n",&pi, pi);
printf("Address of pi: %p Value: %p\n",&pi, pi)
//輸出,%x表示十六進制,%o表示八進制,%p將值顯示為實現(xiàn)專用的格式沟饥,通常是十六進制數(shù)
Address of pi: 4520824 Value: 4520836
Address of pi: 44fb78 Value: 44fb84
Address of pi: 21175570 Value: 21175604
Address of pi: 0044FB78 Value: 0044FB84
//在不同的平臺上用一致的方式顯示指針的值比較困難,一種方法:把指針轉(zhuǎn)換為void指針,然后用%p格式說明符來顯示
printf("Value of pi: %p\n", (void*)pi);
5.內(nèi)存使用方式
6.間接引用操作符(*)解引指針
//*返回指針變量指向的值,稱解引指針
nt num = 5;
int *pi = &num
printf("%p\n",*pi); // 顯示為5
7.null
null概念: 指指針包含了一個特殊的值,和別的指針不一樣贤旷,它沒有指向任何內(nèi)存區(qū)域广料。兩個null指針總是相等的
-
NULL宏: 是強制類型轉(zhuǎn)換為void指針的整數(shù)常量0, 通常理解為null指針, 定義在多種頭文件中, 包括stddef.h、stdblib.h和stdio.h
#define NULL ((void*)0)
ASCII字符NUL: 全0的字節(jié)
null字符串; 是空字符串遮晚,不包含任何字符
8.void指針
void指針是通用指針,用來存放任何數(shù)據(jù)類型的引用
void *pv
//void指針具有與char指針相同的形式和內(nèi)存對齊方式
//void指針和別的指針永遠不會相等拦止,不過县遣,兩個賦值為NULL的void指針是相等的
//任何指針都可以被賦給void指針,它可以被轉(zhuǎn)換回原來的指針類型汹族,這樣的話指針的值和原指針的值是相等
9.全局和靜態(tài)指針
int *globalpi;//全局指針
void foo()
{ static int *staticpi;//靜態(tài)指針
...
}
int main()
{
...
}
棧幀被推入棧中萧求,堆用來動態(tài)分配內(nèi)存,與棧和堆所處的數(shù)據(jù)段不同的數(shù)據(jù)段存放全局/靜態(tài)變量