*號的意義
·在指針聲明時,*號表示所聲明的變量爲指針
·在指針使用時,*號表示取指針所指向的內存空間中的值函數
例子:
#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:變量
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
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:
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:
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語言中一種特別的變量·指針所保存的值是內存的地址·能夠經過指針修改內存中的任意地址內容