1、指针变量
用来存放地址的变量,就是指针变量
2、指针?
就是地址
3、指针变量的定义
数据类型 *指针变量名;
int *p; //定义了一个指针变量,变量名是p
//int表示,p只能存放一个int类型的变量的地址
char *p1; //定义了一个指针变量,变量名是p1
//p1只能存放一个char类型数变量的地址
int num=10;
char *p = # //警告
4、指针变量定义的注意事项
1)“*” 必须得有,如果没有就相当于定义一个普通变量
2)指针变量能用来存放数值或者字符之类的吗? 不能
3)指针变量,归根结底还是变量,也有全局和局部变量之分
----------------------指针变量初始化和引用
指针变量也是变量
指针变量的使用: 定义指针变量 ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)
指针变量如果不初始化会有什么后果?
结论:如果一个指针变量定义以后,如果不进行初始化
这个指针变量存放的事一个垃圾数,这个指针变量,称之为 野指针
一定要避免操作野指针,因为可能会带来意向不到的错误
int *p10; //值是一垃圾值,有可能存放是系统程序的地址
*p10 = 438; //可能会造成系统崩溃
*******************************************************
两个指针变量之间的运算
1)两个指针之间的减法运算
(1)0x0006 - 0x0003 = 3 (意义不大)
(2)常见的用法:两个指针都指向同一个数组
i.判断两个指针变量指向的元素是否连续
ii.判断两个指针变量之间相隔几个元素
int a[5]={1,2,3,4,5};
int *p = a; //p指向了数组的第一个元素
int *p1 = &a[3]; //p指向了数组的第四个元素
注意:两个指针变量之间没有加法运算
2)两个指针之间的关系运算
// p1 > p
//1 表示p1在高位
//0 p在高位或者他们指向了同一个位置
二级指针:如果一个指针变量存放的是另一个指针变量的地址,则称此指针变量为二级指针
int *p=&a;int **p1=&p;
指针为什么要区分类型?
不同类型的指针变量在内存中占用8个字节
为什么都占用8个字节还要区分类型呢?
//如果定义指针变量不定义类型,那么它在取*也就是在取其中的值的时候,就不知道应该读取几个字节,而定义了类型之后,如果是Int类型的就读四个字节,char类型的就读一个字节。
#warning---------->>>>>>>>>>>指针与数组<<<<<<<<<<<<<<--------------
数组指针 与指针数组,其中数组指针有分为一维数组指针 和二维数组指针
*******************************************************
数组指针:
指向数组元素的指针
数组指针的作用:
使用数组指针间接访问数组的元素
数组指针的定义:
int *p;
数组指针的初始化:
int a[4]={1,2,3,4};
int *p = a; //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素
int *p = &a[0]; //等价上面一句话
数组指针如何访问数组的元素:
1)p+1 表示指向数组的下一个元素
2)p-1 指向数组的上一个元素
使用数组指针和使用数组名的区别
p = p+1
*p++
// p是一个指针变量,既然是一个变量,它存放的值是可以改变的
printf(" *p++ = %d\n",*p++);
printf(" *p = %d\n",*p);
//学习的误区: 数组名 a是一个常量 *(10++)
//数组名++ 这是错误的
//printf(" *a++ = %d\n",*a++); //错误的
printf(" *a = %d\n",*a); |
|