C語言筆記系列(六)--指針

1. 概念

指針的值是地址,大多系統內部由無符號整數表示,但它是一種新的數據類型,不是整數類型。

2. %p

int n=20;
printf("%d %p",n,&n);//分別輸出值和地址

3. 數組和指針

  • 表達式
    一維數組:a[i] , *(a+i) , 指針時纔可用a++
    二維數組:a[i][j] ,( (a+i)+j)
  • 帶數組參量的函數
    函數處理數組時必須知道數組的地址和元素個數。
//四種聲明等價
int sum(int *a,int n);
int sum(int *, int );
int sum(int a[],int n);
int sum(int [],int );
//定義只有兩種,名稱不可省略

//變長數組允許動態分配存儲單元
//二維變長數組,兩種聲明等價
int sum(int r,int c,int a[r][c]);
int sum(int ,int int a[*][*]);
  • 數組地址、內容和指針關係
    這裏寫圖片描述
  • 幾種比較混淆的數組和指針
int *p; //p是指向int值得指針
int *pp[2]; //pp是數組,由兩個指針組成的數組,指針是指向int值,可以用它來定義不規則數組。
int(*pa)[2]; //pa是指針,是指向兩個int值數組的指針
int **p2; //p2是指針,指向指針的指針
//a1表示第一行數組的地址,a1[0]表示第一行第一個元素的地址;
//a1+1表示第二行數組的地址,a1[0]+1表示第一行第二個元素的地址;
int a1[3][2];
pp[0] =p = &a1[0][0]; 
pp[1] =p = a1[0];

int a2[2][3];
pa = a1; //pa = a2是錯誤的

p2 =&p;
p2 =&a1[0];
  • 字符串
char s[] = "I love";
char *p = "I love";
//主要區別是s是個常量,p是個變量,只有指針可以使用自增運算符,其他使用差不多。

4. const和指針

  • 當設計意圖是函數不改變數組的內容,則可以給函數聲明和定義時的形式參量使用const。
  • 這只是說明函數在處理時應把數組當做固定不變的,他並不要求原始數組固定不變。
  • const指針不能賦給非const指針,但非const指針允許賦給const指針,前提是只能有一層間接運算。
  • 只有非const數據的地址纔可以賦給普通指針。
  • 只可以修改數據的指針
int *const p = a; //a是數組
p = 1; //允許
p = &a[1]; //錯誤,只可改數據不可改地址
  • 不可改數據也不可改地址的指針,簡稱const指針
const int *p = a; //上面兩種都不允許使用

5. 結構指針

struct{
int code;
float f;
}item, *p;
p = &item;
// p->f, (*p).f, item.f

6. 函數和指針

void toUp(char *);
void *toLow(); //指針函數,是返回某一類型指針的函數
void (*p)(char *); //函數指針,是隻能指向接受char*參數返回爲void函數的指針
p = toUp; //toUp是函數toUp()的地址
(*p)("aa");
p("aa");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章