【C语言精髓 之 指针】指针*、取地址&、解引用*、引用&

/**
 * @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
【C语言精髓 之 指针】指针*、取地址&、解引用*、引用&_第1张图片

指针 是 C语言 的精华,是 C语言 的尽头,值得细品!!!

你可能感兴趣的:(c语言,笔记,开发语言)