指針是C語言中很是重要的概念,也是C語言的特點之一。數組
定義指針變量的通常形式爲:函數
類型名 *指針變量名spa
例如,下列語句定義了指向float類型的指針變量p。3d
float *p;指針
指針用於存放變量的地址。code
指針被定義後,必須將指針和一個特定的變量進行關聯後,才能夠使用指針,也就是說,指針變量要先賦值才能使用,固然指針變量被賦的值應該是地址。blog
指針的基本運算內存
指針能夠同整數進行加減操做,例如,若是變量p是指向float類型變量的指針,那麼表達式p+i表明了從p這個位置開始的第i個float類型變量的地址。io
#include<stdio.h> void Print(int *a) { for(int i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); } int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; Print(a); int *c=a;//a是數組a的地址 printf("%d\n",*c); printf("%d\n",*c+1);//+1 printf("%d\n",*c+2);//+2 return 0; }
指針與數組class
1.在C語言中,數組名自己就是數組的基地址,即第1個元素(下標爲0)的地址。
2.在函數定義中,被聲明爲數組的形參其實是一個指針。當傳遞數組時,按值調用傳遞它的基地址,數組元素 自己不被複制。
3.數組名做爲函數的實參,在被調用函數中,就能訪問實參數組所在的存儲單元,不但能夠引用,還能改變這些單元的內容。返回主調函數後,相應數組元素的值就改變了。
#include<stdio.h> void Print(int *a) { for(int i=0;i<10;i++) printf("%d ",a[i]); } int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; Print(a); return 0; }
用指針實現內存動態分配
在動態存儲方面C語言提供了一組標準函數,定義在<stdlib.h>裏面,主要有:
1.動態存儲分配函數void *malloc(size):在內存的動態存儲區分配一連續空間其長度爲size。
若申請成功,則返回一個指向所分配內存空間的起始地址;若申請內存空間不成功,則返回NULL(值爲0)。
該函數的返回值爲(void *)類型,在具體使用中,須要將malloc的返回值轉換到特定指針類型,並賦給一個指針變量。
2.動態存儲釋放函數void free(void *ptr):釋放由動態分配函數申請到的整塊內存空間,ptr爲指向要釋放空間的首地址。
#include<stdio.h> #include<stdlib.h> int main() { int *p=(int *)malloc(sizeof(int)); printf("%d\n",p);//地址 scanf("%d",p);//向p指向的內存中寫入數據 printf("%d",*p);//使用間接訪問運算符*訪問p中的數據 free(p);//釋放 return 0; }