破除c语言学习第一难关——指针
指针和内存单元
指针: 地址。
内存单元: 计算机中内存最小的存储单位。——内存单元。大小一个字节。 每一个内存 单元都 有一个唯一的编号(数)。称这个内存单元的编号为 “地址”。
指针变量:存地址的变量。
指针定义和使用
int a = 10;
int *p = &a; int* p;--- windows; int *p ---Linux int * p ;
*p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。
如果做左值: 存数据到空间中。
如果做右值: 取出空间中的内容。
举个例子
这里的结果都是350
1、开始的时候a 为 10 ,然后地址为0xff00
2、然后p指针存放者a的地址
3、a 值修改为350,通过指针使得*p的内容最终为350
注:如果第三行代码改为为 *p = 2000,那么查询 a 和 *p 值都会改为2000,因为 *p指向的就是a的空间
任意“指针”类型大小
指针的大小与类型 无关。 只与当前使用的平台架构有关。 32位:4字节。 64位: 8字节。
如
结果都是 8
野指针
1) 没有一个有效的地址空间的指针
int *p;
*p = 1000;
2)p变量有一个值,但该值不是可访问的内存区域。
int *p = 10;
*p = 2000;
【杜绝野指针】
空指针
int *p = NULL;
*p 时 p所对应的存储空间一定是一个无效的访问区域
万能指针/泛型指针(void *)
可以接收任意一种变量地址。但是,在使用【必须】借助“强转”具体化数据类型。
指针和数组
数组名:
【数组名是地址常量】 --- 不可以被赋值。 ++ / -- / += / -= / %= / /= (带有副作用的运算符)
指针是变量。可以用数组名给指针赋值。 ++ --
取数组元素:
指针和数组区别:
1. 指针是变量。数组名为常量。
2. sizeof(指针) ===》 4字节 / 8字节
sizeof(数组) ===》 数组的实际字节数。
指针++ 操作数组:
p的值会随着循环不断变化。打印结束后,p指向一块无效地址空间(野指针)。
指针加减运算
数据类型对指针的作用:
1)间接引用:
决定了从指针存储的地址开始,向后读取的字节数。 (与指针本身存储空间无关。)
2)加减运算:
决定了指针进行 +1/-1 操作向后加过的 字节数。
指针 * / % : error!!!
指针 +- 整数:
1) 普通指针变量+-整数
char *p; 打印 p 、 p+1 偏过 1 字节。
short*p; 打印 p 、 p+1 偏过 2 字节。
int *p; 打印 p 、 p+1 偏过 4 字节。
2)在数组中+- 整数short arr[] = {1, 3, 5, 8};
int *p = arr;
p+3; // 向右(后)偏过 3 个元素
p-2; // 向前(左)偏过 2 个元素
3)&数组名 + 1
加过一个 数组的大小(数组元素个数 x sizeof(数组元素类型))
指针 +- 指针:
指针 + 指针: error!!!
指针 - 指针:
1) 普通变量来说, 语法允许。无实际意义。【了解】
2) 数组来说:偏移过的元素个数。
- 点赞
- 收藏
- 关注作者
评论(0)