指針(pointer
聲明指針
int *p;
定義指針
int a = 4;
int *p = &a; //指針p是指向變量a的地址的指針
指針數組
int *arr[5];
數組指針
int (*arr)[5];
函數指針
int (*fun)(int,int) // 聲明一個指向函數的指針,這個函數的返回值是int,有兩個int的參數
指針的指針
int **p;
const指針
const int *p;//聲明一個指向const int的指針p,p所指向的值不會改變
指針到 const:
int *const p = &a;//const p表示指針p所指向的地址無法改變,但可以改變它所指向的值
const 指針到 const:
const int *const p = &a;//p 是一個指向 const int 的指針,且 p 的地址不能改變
*和[]
例子1:
18.1.c
#include<stdio.h>
int main(){int arr[6] = {0};arr[3] = 4;printf("%d\n",arr[3]);*(arr + 3) = 6;printf("%d\n",*(arr + 3)); return 0;
}
經過上面的例子,可以看到*和[]都可以獲取數組的數值
例子2:
將*(arr + 3) = 6;賦值操作刪除,看看能不能用arr[3],*(arr + 3)兩種方式取得同一個數值
#include<stdio.h>
int main(){int arr[6] = {0};arr[3] = 4;printf("%d\n",arr[3]);printf("%d\n",*(arr + 3)); return 0;
}
例子2告訴我們arr[3],和*(arr + 3)在獲取數值是等價的。
指針的值
int a = 4;
int *p = &4;
int b = 5;
p = &b;
指針也是一個變量,有自己的值,而這個值存儲的是其它變量或函數的地址
而p所在的內存地址是我們無法修改的,正如我們無法修改a的內存地址,事實上任何變量或函數的內存地址我們都無法直接修改,那也不是我們應該干的。
數組參數的類型 – 指針
#include <stdio.h>void fun() {printf("sizeof(a): %zu\n", sizeof(a));// %zu是
}int main(void) {int array[10];printf("sizeof(array): %zu\n", sizeof(array));fun(array);return 0;
}
問1:上述代碼的輸出結果是多少呢?
答1:
40
8
sizeof(array)判斷的是數組的長度,int型數組有十個元素,自然是40B
在x86-64的操作系統上
對于int a[]參數,sizeof(a)輸出8,是因為一個指針占8B
二維數組的內存分配
int (*arr)[2][5];
假設arr[0][0]在內存中的地址是X
arr[1][3]在內存中的地址是X+45+34,(X+32)
arr[i][j]在內存中的地址是X+4arr[0].size()i+4j,(X+4arr[0].size()i+4j)
指針的指針與二位數組
看一下這兩者有何區別
char **argv;
char* argv[];
在c中,main函數可以這樣寫
int main(int grac,int **argv)
也可以這樣寫
int main(int grac,int *argv[])
在函數參數中,兩者是等價的