標籤:還需 等價 ring 優先順序 類型 bsp 另一個 還需要 改變
C語言中對變數的訪問有兩種方式:
1)直接存取,通過變數名;
2)間接訪問,通過地址來訪問某一個變數,該變數的地址是另一個變數的內容。
事實上,程式經過編譯後,對變數的訪問都會變為從地址的訪問。
printf("%d \n", i);
scanf("%d \n", &i); //scanf語句使用&i來訪問
一個變數的地址稱為該變數的指標,地址被形象的稱為指標,如果一個變數專門用來存放另一變數的地址,它被稱為
"指標變數",指標變數的值---是另一個變數的地址,指標變數的地址---是本身變數的地址。
定義指標變數:
類型名 *指標變數名;
int *point_1;
int *point_2 = &b; //定義時,初始化
指標變數名前的"*"表示變數為指標變數,point_1的值表示另一變數的地址,*point_1表示另一變數的值
&point_1表示該指標變數的地址
定義指標變數時,必須制定基底類型,因為訪問一個變數不但需要知道首地址,還需要知道訪問的位元組數。
&取地址運算子; *指標運算子
指標在調用指標運算子,對另一變數賦值的時候,必須先對指標的值進行初始化,否則,指標指向的地址未知,容易發生錯誤。
int * temp;
*temp = *p1; //容易產生錯誤
當指標變數作為函數參數時,它表示將一個變數的地址傳送給另一變數。
void swap(int *ptr1, int *ptr2) {
int *temp;
temp = *ptr1; //輸入指標互動各自內容,temp可以定義為普通int變數
*ptr1 = *ptr2;
*ptr2 = temp;
}
void swap(int *ptr1, int *ptr2) {
int *temp;
temp = ptr1; //輸入指標各自指向的地址交換
ptr1 = ptr2;
ptr2 = temp;
}
數組名作為函數的實參傳遞時,也是表示指標的傳遞。
void main () {
fun(array,10);
}
void fun(int arr[], int n) {
}
實參用指標、數組表示,形參用數組、指標表示都是等價的。
通過指標引用數組。數組本身也是一種特殊的指標:
int a[10];
int *ptr;
ptr = &a[0]; //C語言中數組a[10]的地址,可以用&a[0]或者a來訪問
ptr = a; //與&a[0]等價
數組元素的引用:
下標: a[i];
指標:*(a+i)
*(p++),表示先取*p的值,然後p自加1;
*(++p),表示p先自加1,然後再取*p的值;
C語言中,字串是存放在字元數組中的,有兩種表示方法:
1) 用字元數組存放一個字串,通過數組下標引用某個字元,%s+數組名輸出整個字串,%c+數組下標輸出某個字元
char string[] = "I am a big man"
printf("%s\n",string);
printf("%c\n",string[4]); //最後一個字元存放"\0"
2) 用指標變數指向一個字串常量
char *string = "I am a big man"
等價於 char *string; string = "I am a big man" //對字元指標的訪問不需要加"*"
指向函數的指標,系統編譯的時候,編譯系統會為子函數代碼分配一段儲存空間,這段儲存空間的起始地址稱為這個函數的指標。
int (*p) (int,int)表示指向一個傳回值為int,且有兩個int 參數的函數。
所以函數的調用可以使用函數名直接調用,也可以通過函數指標來調用。
int main() {
int max(int, int); //函式宣告
int (*p)(int, int); //函數指標聲明
int a,b;
p = max; //使得P指向max函數
c = (*p) (a,b); //通過函數指標調用函數
}
返回指標的函數定義: 類型名 *函數名(參數列表)
float *search (float *point, int b) //傳回值為float *類型的指標
指標數組:一個數組,其中的每個值都是指標變數,類型名 *數組名[數組長度]
int *p[4]; //[]優先順序比*高,所以先形成p[4]形式,後加*p
int (*p)[4]; //表示指向一維數組的變數
動態分配記憶體空間,
void *malloc(unsigned int size); //分配大小為size位元組的連續空間,賦值時,最好強制轉換指標類型。
void *calloc(unsigned n, unsigned int size); //分配n個連續的size位元組大小的連續空間,賦值時,最好進行強制類型轉換。
void *free(void *p); //釋放指標p指向的已指派的動態空間。
void *realloc(void *p, unsigned int size); //已指派過的地址,重新改變其大小。將p指向的地址,改為size大小。
將void類型的指標賦值給不同的基底類型的指標變數時,不需要使用者進行強制類型轉換,編譯系統會自動進行轉換。
C語言---指標