第26課 指針的本質分析

*號的意義
·在指針聲明時,*號表示所聲明的變量爲指針
·在指針使用時,*號表示取指針所指向的內存空間中的值函數

例子:
#include"stdio.h"
int main()
{指針

int i = 5; 
int *p =&i;
printf("%d,%p\n",i,p);
*p = 10;   
printf("%d,%p\n",i,p);
return 0;

};
輸出結果:
5,00EFFEA40
10,00EFFEA4code

指針也是變量,變量就有地址,指針也能夠取地址內存

變量P保存着變量i的內存地址,即:
p→&i
*p→iio

例子26-1:變量

include"stdio.h"

int main()
{數據類型

int i = 0;
int* pI;
char* pC;
float* pF;

pI = &i;
*pI = 10;
printf("%p,%p,%d\n",pI,&i,i);
printf("%p,%p,%d\n",sizeof(int*),sizeof(pI),&pI);
printf("%p,%p,%d\n",sizeof(char*),sizeof(pC),&pC);
printf("%p,%p,%d\n",sizeof(float*),sizeof(pF),&pF);
return 0;

};
輸出結果:
0056F808,0056F808,10
00000004,00000004,5699580
00000004,00000004,5699568
00000004,00000004,5699556
指針變量只須要4個字節的變量存取,並且int char float 類型的指針變量都是4個字節float

傳值調用與傳址調用
·指針是變量,所以能夠聲明指針參數
·當一個函數體內部須要改變實參的值,則須要使用指針參數
·函數調用時實參值將複製到形參
·指針適用於複雜數據類型做爲參數的函數中
例子26-2:error

include"stdio.h"

int swap(int a,int b)
{數據

int c = a;
a = b;
b = c;

}
int main()
{

int aa = 1;
int bb = 2;
printf("aa = %d,bb = %d\n",aa,bb);
swap(aa,bb);
printf("aa = %d,bb = %d\n",aa,bb);
return 0;

}
輸出結果:
aa = 1,bb = 2
aa = 1,bb = 2
函數分析:輸出結果沒有變化是由於swap(aa,bb);將值給了a,b,並無參與運算,只是簡單的傳值調用。

改26-2:

include"stdio.h"

int swap(int a,int b)
{

int c = *a;
*a = *b;
*b = c;

}
int main()
{

int aa = 1;
int bb = 2;
printf("aa = %d,bb = %d\n",aa,bb);
swap(&aa,&bb);
printf("aa = %d,bb = %d\n",aa,bb);
return 0;

}
輸出結果:
aa = 1,bb = 2
aa = 2,bb = 1
函數分析:
傳址調用,傳的是地址,就能改變aa,bb的地址。

常量與指針
·const int* p; //p可變,p指向的內容不可變
·int const* p; //p可變,p指向的內容不可變
·int* const p; //p不可變,p指向的內容可變
·const int* const p //p不可變,p指向的內容不可變
口訣:左數右指
當const出如今*號左邊時指針指向的數據爲常量
當const出如今*後右邊時指針自己爲常量

例子26-3:

include"stdio.h"

int main()
{

int i = 0;
const int* p1 = &i;
int const* p2 = &i;
int* const p3 = &i;
const int* const p4 = &i;

*p1 = 1;  //error
p1 = NULL;

*p2 = 1;  //error
p2 = NULL;

*p3 = 1;
p3 = NULL; //error

*p4 = 1;   //error
p4 = NULL; //error

}小結:·指針是C語言中一種特別的變量·指針所保存的值是內存的地址·能夠經過指針修改內存中的任意地址內容

相關文章
相關標籤/搜索