指针(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 a = 5;
const int *p;//声明一个指向const int的指针p,p所指向的值不会改变
(*p) ++; //error
&p = a; //right
指针到 const:
int a = 5;
int *const p = &a;//const p表示指针p所指向的地址无法改变,但可以改变它所指向的值
(*p) ++; //right
&p = a; //error
const 指针到 const:
int a = 5;
int b = 6;
const int *const p = &a;//p 是一个指向 const int 的指针,且 p 的地址不能改变
(*p) ++; //error
&p = a; //error
*和[]
例子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[])
在函数参数中,两者是等价的