指针
- 指针就是地址,地址就是指针
- 地址就是内存单元的编号——从零开始的非负整数,其范围:4G
- 指针变量就是存放地址的变量
- 指针和指针变量是两个不同的概念
- 但是要注意:通常我们叙述是会把指针变量简称为指针,实际它们含义并不一样
- 指针的本质就是一个操作受限的非负整数
int *p
*p是一个int,所以p是一个指针
p是变量的名字,int *表示p变量存放的是int类型变量的地址
#include <stdio.h>
int main(void)
{
int *p;//p是变量的名字,int *表示p变量存放的是int类型变量的地址
/*
p是变量名,P变量的数据类型是 int *类型
int *类型就是存放int变量地址的类型
*/
int i = 3;
int j;
p=&i;
/*建议记住下面3点
1.p保存了i的地址,因此p指向i
2.p不是i,i也不是p,更准确的说,修改p的值不影响i的值,修改i的值,也不会影响p的值
3.如果一个指针变量指向了某个普通变量,则
*指针变量 就完全等同于 普通变量
举例:
如果p是个指针变量,并且p存放了普通变量i的地址
则p指向了普通变量i
*p 就完全等同于 i
或者说:在所有出现*p的地方都可以替换成i
在所有出现i的地方都可以替换成*p
*p 就是以p的内容为地址的变量——此处p的内容
*/
//p=i; error,因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量的值
//p=55; error,原因同上
j = *p; //等价于 j=i
printf("i = %d, j = %d\n", i, j);
return 0;
}
指针的重要性
- 表示一些复杂的数据结构
- 快速的传递数据
- 使函数返回一个以上的值
- 能直接访问硬件
- 能够方便的处理字符窜
运算符&
- scanf("%d", &i)里的&
- 获得变量的地址,他的操作数必须是变量
- 地址的大小是否与int相同取决于编译器
- int i; printf("%p", &i);%p把值作为地址来输出
&只能对变量取地址
- &不嫩谷底没有地址的东西取地址
- &(a+b)?
- &(a++)?
- &(++a)?
#include <stdio.h>
int main(void)
{
int a[10];
printf("%p\n", &a);
printf("%p\n", a);
printf("%p\n", &a[0]);
printf("%p\n", &a[1]);
return 0;
}
数组名称地址即是数组元素首元素的地址
scanf——传入地址
scanf也是C的函数
指针的分类
1.基本类型指针
int *p ——> p是变量名字,int *表示p变量存放的是int类型变量的地址
p = &i ——> p保存i的地址,所以p指向i
*p = i ——> 因为p指向i,所以 *P就是i
2.指针和数组
3.指针和函数
4.指针和结构体
5.多级指针
#include <stdio.h>
int main(void)
{
int *p;
int i = 5;
*p = 5;
printf("%d\n",