C語言---指標

來源:互聯網
上載者:User

標籤:還需   等價   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語言---指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.