/*** @file * @author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * @copyright 2023.9* @COPYRIGHT 原创技术笔记:转载需获得博主本人同意,且需标明转载源* @language C */
- UpData Log👆 2023.9.22 更新进行中
- Statement0🥇 一起进步
- Statement1💯 有些描述是个人理解,可能不够标准,但能达其意
技术提升站点
- 定义指针 与 取地址
int val=1; //为 变量名为val 的 整型数据 开辟空间,并存下val的值
int* p=&val; //定义一个指针变量(是指针的原因使用到了*)的名字为p,p记录的是(&val)val变量的地址,此时 p指针 指向 val 这个整型变量
printf("%d 的地址是 %p\n",val, p);
- 解引用:返回p所指对象的值
//要使用 p所指向地址的值(即val的值) 的话,需要 将p(实质上是 val 的地址)通过 * 解出来
printf("指针p指向的val的地址为 %p,解引用得到val的值为%d",p, *p);
- 通过 指针 修改 指针 所指地址的变量的值
//定义指针后,*p 实质上就是 val,修改 *p 就是修改 val(因为变量名val 与 p 都指向的 val的地址)
*p=2; //此时 *p=val=2
printf("修改后val的值为:%d",val);
- 修改指针的指向
//声明两个变量,
int a=1,b=2;
int* p=&a; //初始化 p 指向a变量
p=&b; //修改 p指针 存储 b的地址,p由 指向a变量 变为 指向b变量
printf("修改后的p指针指向的值为:%d",*p);
- 无指向的野指针
注:声明一个指针但不给分配指向,这个指针是无效的野指针(必须要给指针明确的指向)
要先为 值
开辟一个空间(内存) 来进行 存储、调用、修改 操作
//错误示范
int* p;
*p=2; cout<<*p;//下面这种是可以的
int* p;int val;
p=&val; //分配指向
*p=2;
- 输入
int val; int *p=&val;
scanf("%d",p); //p=&val,效果等同于scanf("%d",&val)
printf("%d",val);
- (*p)++ 、 * (p++) 、*p++ 的区别
运算符优先级
点击了解更多
圆括号()
优先级高于下面两种,结合方式是 自左向右,不论任何情况先执行括号内的东西!
自增运算符++(不论前缀还是后缀)
>取值运算符*
,这两种的结合方式都是 自右向左
//(*p)++ :p指针指向对象的值加1(地址值不变)
int val=1; int* p=&val;
(*p)++; printf("p指针指向对象的值为%d,val的值为%d",(*p), val);//Output:2,2//*(p++) 与 *p++ 操作结果相同,都是将地址值加1个整型字节(4bit)
int val=1; int* p=&val;
printf("val的地址为%p\n",p);
*p++; //现在的p指针就是一个野指针,(*p)是无效的
printf("p指针的值(地址)为%p",p);
//Output:
val的地址为63fe14
p指针的值(地址)为63fe18
根据运算符优先级的结合方式可以推出:++ *p
与 ++(*p)
(思索一下自右向左的意思)操作的结果是一致的(即对 p指针指向对象的值加1)
- 传参与收参
如何修改 val 的值?
/*---------传参直接传地址--------*/
//传的如果是地址的话,都是直接对 &val这个地址 进行操作(来直接修改地址对应的值)
void Update(int* addr){ //(接收参数的是地址)声明一个指针变量为address(此时 address=p=&val)(*addr)++; //将地址 解引用 得到值,对值修改
}
/*写法二
void Update(int* addr){int temp=(*addr); //申请一个新内存,用来操作值,然后将p指向对象的值存下(temp现在就是 val的值 的代理人)temp++; (*addr)=temp;
}
*/
int main(int argc,char* argv[]){int val=1; int* p=&val;Update(p); //传入的是 &val(val的地址)printf("%d",val); return 0;
}//Output:2/*---------传参传的是val的值(地址的解引用)--------*/
void Update(int temp){ temp++; //此时的修改是影响不到val的
}
int main(int argc,char* argv[]){int val=1; int* p=&val;Update(*p); //传入的是 val(val的值),就和传普通的变量一样!printf("%d",val); return 0;
}//Output:1