一级指针
指针其实就是存放内存地址的变量,其长度在32位系统上固定为4字节。
指针数组
- 数组的存储内容是指针1int *p[];
数组指针
- 指向一个数组的指针1int (*p)[];
指针函数
- 函数的返回值类型是一个指针类型1234void *pf();/* or */typedef void *pf();pf function(); // 定义实例
所以指针函数用于修饰函数返回值
函数指针
- 指向一个函数的指针(函数名 与 &函数名 都表示函数运行的首地址)1234void (*fp)();/* or */typedef void (*fp)(int ,char);fp function; // 定义实例
二重指针
- 指向一个int*类型的指针1int **p;
| 实例 | 意义 |
|---|---|
| int a; | &a是一个int *型变量 |
| int *p; | 指针p指向一个int型变量 |
| int **p; | 指针p指向一个int *型变量 |
| int a[3] | a | a | a+1 | &a | &a+1 |
|---|---|---|---|---|---|
| int 类型 | 数组首元素首地址 | (int)a + 1sizeof(int), 地址加4byte即a[1] | 数组首地址 | (int)a + 1*sizeof(int[3]), 地址加12byte即a[3] |
话说大端小端
- 大端:数据的高字节存储在低地址中
- 小端:数据的低字节存储在低地址中
代码判断
|
|
|
|
指针都是4字节,为什么还要定义指针类型?
定义指针类型的好处是:定义一个指针时,编译器为指针所指向的内容定义好大小,无需程序员去管理
代码中的变量在内存的情况
计算机的内存地址分配原则:
内存寻址由大到小,优先分配内存地址较大的空间给变量(从下往上),先定义的变量,分配的地址越大
123456789 int main(){int a = 2;char c = 1;int *p = &c; // 编译器不会报错,但会有警告,因为指针类型不匹配printf("%d .\n",*p);return 0;}

- 指针读取数据是箭头从下往上读取,该代码运行结果为513
注:本文内容部分来自互联网整理,部分来自个人经验总结;本文将持续收集更新,欢迎留言补充!

