绍兴做外贸网站的公司,常州建设网站代理商,wordpress手机上用的,wordpress 建网站视频概述
内存地址
在计算机内存中#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解#xff0c;内存就是房间#xff0c;地址就是门牌号
指针和指针变量
指针#xff08;Pointer#xff09;是一种特殊的变量类型#xff0c;它用于存储内存地址。指针的实…概述
内存地址
在计算机内存中每个存储单元都有一个唯一的地址(内存编号)。通俗理解内存就是房间地址就是门牌号
指针和指针变量
指针Pointer是一种特殊的变量类型它用于存储内存地址。指针的实质就是内存“地址”指针变量就是存储这个地址的变量。
指针作用
可间接修改变量的值
指针变量的定义和使用
指针也是一种数据类型指针变量也是一种变量指针变量指向谁就把谁的地址赋值给指针变量
语法格式
类型 变量;
类型 * 指针变量 变量;叫取地址返回操作数的内存地址叫解引用指操作指针所指向的变量的值在定义变量时* 号表示所声明的变量为指针类型 指针变量要保存某个变量的地址指针变量的类型比这个变量的类型多一个*在指针使用时* 号表示操作指针所指向的内存空间 示例代码
#include stdio.hint main() {// 定义一个int类型的变量同时赋值为10int a 10;// 打印变量的地址printf(a %p\n, a);// 定义一个指针变量int *保存int的地址// int *代表是一种数据类型int *指针类型p才是变量名int* p;// 指针指向谁就把谁的地址赋值给这个指针变量p a;// 打印p, *p, p指向了a的地址*p就是a的值printf(p %p, *p %d\n, p, *p);return 0;
}通过指针间接修改变量的值
指针变量指向谁就把谁的地址赋值给指针变量 通过 *指针变量 间接修改变量的值
#include stdio.hint main() {// 定义一个int类型变量a同时赋值为0int a 0;// 定义int *指针变量同时赋值a的地址int *p a;// 通过指针间接修改a的值*p 123;printf(a %d\n, a);// 定义一个int类型变量b同时赋值为5int b 5;// p 保存 b的地址p b;// 通过指针间接修改b的值*p 250;printf(b %d\n, b);return 0;
}指针与常量
- 语法格式
int a 1;
const int *p1 a; // 等价于 int const *p1 a;
int * const p2 a;
const int * const p3 a;从左往右看跳过类型看修饰哪个字符 如果是* 说明指针指向的内存不能改变 如果是指针变量说明指针的指向不能改变指针的值不能修改
#include stdio.hint main() {int a 1;int b 2;// p1 可以改*p1不能改const int *p1 a; // 等价于 int const *p1 a;// p1 b; // ok// *p1 555; // err// p2 不能修改*p2可以修改int *const p2 a;// p2 b; //err// *p2 555; // ok// p3 和 *p 都不能改const int *const p3 a;// p3 b; // err// *p3 555; // errreturn 0;
}指针大小
使用sizeof()测量指针的大小得到的总是4或8sizeof()测的是指针变量指向存储地址的大小在32位平台所有的指针地址都是32位(4字节)在64位平台所有的指针地址都是64位(8字节)
#include stdio.hint main() {int *p1;int **p2;char *p3;char **p4;printf(sizeof(p1) %llu\n, sizeof(p1));printf(sizeof(p2) %llu\n, sizeof(p2));printf(sizeof(p3) %llu\n, sizeof(p3));printf(sizeof(p4) %llu\n, sizeof(p4));printf(sizeof(double *) %llu\n, sizeof(double *));return 0;
}指针步长
指针步长指的是通过指针进行递增或递减操作时指针所指向的内存地址相对于当前地址的偏移量。指针的步长取决于所指向的数据类型。指针加n等于指针地址加上 n 个 sizeof(type) 的长度 指针减n等于指针地址减去 n 个 sizeof(type) 的长度
#include stdio.hint main() {char ch;char *p1 ch;printf(p1:%p, p11: %p\n, p1, p1 1); // 步长为1字节int a;int *p2 a;printf(p2:%p, p21: %p\n, p2, p2 1); // 步长为4字节double d;double *p3 d;printf(p3:%p, p31: %p\n, p3, p3 1); // 步长为8字节return 0;
}野指针和空指针
指针变量也是变量是变量就可以任意赋值任意数值赋值给指针变量没有意义因为这样的指针就成了野指针此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)野指针不会直接引发错误操作野指针指向的内存区域才会出问题为了标志某个指针变量没有任何指向可赋值为NULLNULL是一个值为0的宏常量
#include stdio.hint main() {int *p;p 0x12345678; // 给指针变量p赋值p为野指针 ok不会有问题但没有意义// *p 1000; // 操作野指针指向未知区域内存出问题errprintf(111111111111111111\n);int *q NULL; // 空指针return 0;
}多级指针
C语言允许有多级指针存在在实际的程序中一级指针最常用其次是二级指针。 二级指针就是指向一个一级指针变量地址的指针。
#include stdio.hint main() {int a 100;// 一级指针int* p1 a;printf(a%p\n, a);printf(p1%p\n, p1);printf(p1%p\n, p1);// 二级指针可以存储一级指针变量的地址int** p2 p1;printf(p2%p\n, p2);printf(p2%p\n, p2);// 三级指针可以存储二级指针变量的地址int*** p3 p2;printf(p3%p\n, p3);printf(p3%p\n, p3);printf(---------------------\n);// 通过一级指针访问100打印出来printf(*p1%d\n, *p1);// 通过二级指针访问100打印出来printf(**p2%d\n, **p2);// 通过三级指针访问100打印出来printf(***p3%d\n, ***p3);return 0;
}