指針
學(xué)習(xí)目的
指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); 能很方便地使用數(shù)組和字符串; 并能象匯編語言一樣處理內(nèi)存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。
知識(shí)點(diǎn)
- 指針;
- 指針變量;
- 為什么要指針;
- ‘*’與‘&’的區(qū)別;
- 指針變量本身在內(nèi)存空間里面占據(jù)8個(gè)字節(jié);
- 數(shù)組和指針的關(guān)系;
- 如何給指針指向的區(qū)域賦值。
知識(shí)點(diǎn)詳解
- 指針:
- 我們使用的計(jì)算機(jī)內(nèi)存為8G,系統(tǒng)為了更好地管理我們的內(nèi)存,就為內(nèi)存區(qū)的每一個(gè)字節(jié)都分配一個(gè)編號(hào)(唯一),這就是“地址”。
- 指針的實(shí)質(zhì)就是地址,就是這一個(gè)個(gè)編號(hào)。
- 指針變量:
- 指針變量就是用來存放指針(地址)的變量,它的值是另一個(gè)變量的地址。
- 在64位平臺(tái),所有類型變量的地址都是8字節(jié)。
- 為什么要指針:
解決跨區(qū)域(不同作用域 不同代碼塊)之間的數(shù)據(jù)交互。
- ‘*’與‘&’的區(qū)別:
- ‘*’:
1.聲明/定義變量的時(shí)候 表示指針變量
float b=20;
int c=10;
int *a;//定義一個(gè)指針變量指向的內(nèi)存空間只能存放整數(shù)
注意:定義一個(gè)指針變量的時(shí)候一定要給初值 不確定就給NULL
常見錯(cuò)誤:
int *a=b;不行,指針變量只能存地址 不能存具體值
int *a=&b;不行,整形指針只能存整形數(shù)據(jù)的地址
int *a=&c;正確
2.除了定義指針變量外 都是在訪問某個(gè)地址的值
int *temp=&c;//定義指針變量1
*temp=21;//訪問temp地址里面的數(shù)據(jù) 賦值為21
- ‘&’:
獲取變量的地址
int a=10;
int *p=&a;
- 指針變量本身在內(nèi)存空間里面占據(jù)8個(gè)字節(jié)
int test(int a){
return 0;
}
int main(int argc, const char * argv[]) {
int a = 10;
int *pa = &a;
int a2[10] = {};
int *pa2 = a2;
int(*pFunc)(int) = test;
char c = 'a';
char *pc = &c;
printf("%lu\n",sizeof(a)); //4
printf("%lu\n",sizeof(pa));//8
printf("%lu\n",sizeof(a2));//40
printf("%lu\n",sizeof(pa2));//8
printf("%lu\n",sizeof(pFunc));//8
printf("%lu\n", sizeof(pc));//8
- 數(shù)組和指針的關(guān)系:
數(shù)組名并不是一個(gè)變量 沒有分配內(nèi)存空間
指針變量是有內(nèi)存空間
for (int i = 0; i < 5; i++) {
printf("%d ",score[i]);
}
for (int i = 0; i < 5; i++) {
printf("%d ", *(score + i));
}
//score+1 = 0x100 + 1 * 4 = 0x104;
printf("%p\n", score); //0x7ffeefbff4d0
printf("%p\n", score+1);//0x7ffeefbff4d4
printf("%d\n", *(score+1));//32
printf("%d\n", *score+1);//40
//int score[5] = {39,32,87,58,27};
//printf("%p\n", *score++);
printf("%d\n", (*score)++);//39
printf("%d\n", score[0]);//40
printf("%d\n", ++*score);//41
- 定義一個(gè)數(shù)組 系統(tǒng)會(huì)分配內(nèi)存空間 可以存值
int num[10] = {};
- 定義一個(gè)指針變量 只為變量本身分配8個(gè)字節(jié)的內(nèi)存空間.無法賦值 因?yàn)闆]有為他分配可以存值的內(nèi)存空間
int *p;
- 如何給指針指向的區(qū)域賦值
1.指針變量已經(jīng)指向某塊區(qū)域
int a3 = 10;
int *pA = &a3; //指向變量a的內(nèi)存地址
*pA = 30;
2.指針指向一個(gè)數(shù)組
int num2[10] = {};
int *pNum = num2; //指向數(shù)組num2的首地址
*(pNum+0) = 20;
pNum[0] = 20;
*(pNum + 1) = 30;
pNum[1] = 30;
3.動(dòng)態(tài)分配內(nèi)存
malloc realloc free,上兩種指向的內(nèi)存都是別人的。如果希望分配一個(gè) 屬于自己的內(nèi)存空間,自己分配的內(nèi)存空間必須自己釋放,普通變量的內(nèi)存是系統(tǒng)自己分配 所以系統(tǒng)自己進(jìn)行釋放。
char *pName = malloc(3 * sizeof(char));
//判斷分配是否成功
if(pName == NULL){
//分配失敗
exit(EXIT_FAILURE);
}
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c';
//當(dāng)之前分配的內(nèi)存空間不夠了 就需要在之前的基礎(chǔ)上重新分配
//realloc 必須是之前使用malloc分配過的
//如果是系統(tǒng)分配的內(nèi)存 是不能使用realloc的
//用完了就要自己釋放內(nèi)存
pName = realloc(pName, 4*sizeof(char));
pName[3] = 'k';
printf("%s\n", pName);
free(pName);