#include <stdio.h> int main() { printf("Hello, World!\n"); int i = 3; int * p = &i;
printf("%d",*p); return 0; }
指针 = 指针变量类型 + 指针变量 + 同类型变量的地址赋值
说明
- int i = 3 声明了一个int类型的i变量,并赋值了3这个值
- int * p 声明了一个int指针类型 的 p指针变量,注意不是*p!!!, int * 表示这是一个int指针类型
- &i 表示取这个i变量的地址,变量的地址也是一个值
- int * p = &i 表示把 i变量的地址赋值给p指针变量【指针就是地址】
- *p 表示通过存放的&i地址访问i变量存储的值,也就是说 *p == i 这个意思
注意事项:
- 不要把i变量直接赋值给p,两者的类型就不一样,一个是int类型的变量,一个是int指针类型的变量
- 也不要把值直接赋值给p,原因同上
- 当&i赋值给了p,也就是说p保存了i的地址,因此,p指向了i
- 指针变量,是一个只能存放同类型的变量地址的地址变量
- 指针和地址是同样的一个涵义
- *指针变量 完全等同于 普通变量,所有 *p 的地方 都可以 替换 i,反之也可以
指针的用途:
- 表示复杂的数据结构
- 快速传递数据
- 函数的返回值可以返回多个值
- 直接访问硬件
- 方便的处理字符串
- 是理解面向对象语言的基础
总结:指针是C语言的灵魂所在!!
指针的定义:
- 什么是地址?
地址是内存单元的编号
从0开始的非负整数
范围:4G内存 230 * 22 = 4GB - 1
- 什么是指针?
指针就是地址,地址就是指针
指针变量就是存放内存单元编号的变量
指针和指针变量是两个不同的概念
指针的本质是一个操作受限的非负整数,可以相减操作,不可加乘除
错误类型示范:
#include <stdio.h> int main() { int * p ; int i = 3; *p = i; printf("%d",*p); return 0; }
声明一个int指针类型变量p 但是,不为p赋值任何的变量地址,此时的p则是一个野指针,会指向内存中任意一个内存单元
*p = i 是把i变量的值 3 赋值给指针变量p所指向的未知内存单元变量,这个行为是非常危险的!!!
int main() { int i = 3; int * p; int * q; p = &i; *q = p; printf("%d",*q); return 0; }
- 声明int类型变量i并赋值3,声明int指针类型p和q
- p指针变量 指向 i变量的地址
- *q 指向 p指针变量,这是一个语法错误,*p能访问或者赋值的是一个int类型变量的值或者字面量,但是p是一个int指针类型,所以类型不匹配报错
- 如果改成 *q = *p ,这就回到上面的错误了,q指针变量又是一个野指针,指向一个未知的内存单元,并赋值i变量
- 如果改成 p = q, 那就是把q指针变量指向的未知内存单元,赋值给p指针变量,*q则会读取这个未知内存单位存放的值
自学视频《郝斌C语言自学教程》 121 - 126:
https://www.bilibili.com/video/BV1os411h77o
C指针形象动画视频: