详解:取地址操作符(&)及解引用操作符(*)

简介: 详解:取地址操作符(&)及解引用操作符(*)

对于指针:我想,应该是多数人的梦魇,包过笔者也一样,之前老是听前辈说过,指针怎么怎么样,怎样难!但是,总归是片面的,不可取的,现在笔者也在刚刚学习到了:指针,所以打算博客一篇,来纪念一下:第一次对于指针的初步认识,及感悟!


   首先:我们需要理解指针的两个概念:


数据在内存中的存储:编号----》地址-----》指针


1.指针是内存中最小单元的编号(1个字节),也就是地址!


2.平时口语中所说的指针:通常指的就是指针变量,是用来存放内存地址的变量!


因此:我们对于上述的简单总结为:


指针就是地址,口语中所说的指针,通常指的就是指针变量


指针变量:通过&(取地址操作符)取出变量的内存起始地址,把地址存放在一共变量中,这个变量就是指针变量!


下面来用代码介绍如何打印地址!


#include <stdio.h>
int main()
{
  int a = 10; 
  printf("%p\n", &a);   //    用%p来打印地址
  return 0;
}

 在这里printf("%p\n", &a);   //    用%p来打印地址,我们需要着重注意%p是用来打印地址的!


代码的运算结果为:


0a2653c851af460fa595bd959398a8f1.png


因为,我们给a赋初始值a=10;将a存储起来就需要一个地址(电脑分配),所以我们可以通过这个地址来找回a的值,这个也是可行的,这个就是需要我们对'&a',进行解引用操作(*),对于解引用操作(*),下面笔者将会进行讲解!因此读者,请稍安勿躁!


6de278e6d6694ce5bb08e7e842b7e74b.png


对于这个代码,在第150行是不可取的,下面已经给了警告!


虽然运转出来结果了,但是做法是不可取的!


因此,正确的书写规范为:


#include <stdio.h>
int main()
{
  int a = 10;
  int* pa = &a;
  printf("%d\n", *pa);
  //printf("%d\n", pa);   //错误写法,不可取
  return 0;
}

因此,用指针来通过取地址求值时候,需要进行有效的代码!


int a = 10;    int* pa = &a;  在这段代码中,笔者希望能够正确理解各个所代表的含义!


对于int*pa=&a,在这句中  int 指向a的类型为int型,*指向pa为指针变量!


同理,对于;char  ch;   char  *pc=&ch;有着一样的解释,根据上面的解释,就能得到该段代码表示的具体意思!


但是,对于   int* pa = &a;   可以写成:int* pa;    pa = &a;    因此,上述代码可以写为:


#include <stdio.h>
int main()
{
  int a = 10;
  int* pa;
  pa = &a;
  printf("%d\n", *pa);
  return 0;
}

代码的运行结果也是一样的!


12c3b7f3f8814309a195c64f051d4445.png


int* pa;   pa = &a;,在该段代码中,我们可以看出来:pa只是一个定义了int类型的指针,(  pa = &a)前面并没有任何标识; 但是对于printf("%d\n", *pa);打印结果时候,用了*(解引用操作符)这个跟int*pa=&a;及int *pa;中的表示意义是不一样的!需要多多注意


pa虽然是指针,存放着a的地址,但是pa也有着自己的地址!通过对pa的地址进行解引用操作,也一样可以找到a的值!


#include <stdio.h>
int main()
{
  int a = 10;
  //int* pa = &a;
  int* pa;
  pa = &a;
  printf("%d\n", *pa);
  int** ppa = &pa;
  printf("%d\n", **ppa);
  return 0;
}


在这个代码里面,将涉及部分二级指针的内容!


代码的运行结果为:


34e8d716411043c08c7ffba9fbba23de.png


有意者请联系笔者私聊,或者参考读者以后代码!在这里笔者将不再进行涉及二级指针的内容


相关文章
|
C++
35 C++ - 指针运算符(*、->)重载
35 C++ - 指针运算符(*、->)重载
74 0
|
9月前
|
编译器 C++ 索引
C learning_13 操作符前篇(条件操作符、 逗号表达式、 下标引用、函数调用和结构成员、 表达式求值)
C learning_13 操作符前篇(条件操作符、 逗号表达式、 下标引用、函数调用和结构成员、 表达式求值)
指针变量和解引用操作符
指针变量和解引用操作符
79 0
【C++】类与对象(三) 运算符重载 赋值重载 取地址及const取地址操作符重载(2)
【C++】类与对象(三) 运算符重载 赋值重载 取地址及const取地址操作符重载(1)
|
索引
操作符之关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用操作符,函数调用操作符,访问结构体成员操作符
操作符之关系操作符,逻辑操作符,条件操作符,逗号表达式,下标引用操作符,函数调用操作符,访问结构体成员操作符
|
编译器 C语言
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
133 0
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
|
C语言 索引
【C语言】 操作符(下): -- 条件操作符 --逗号表达式 -- 下标引用操作符 --表达式求值1
【C语言】 操作符(下): -- 条件操作符 --逗号表达式 -- 下标引用操作符 --表达式求值1
|
C语言
【C语言】 操作符(下): -- 条件操作符 --逗号表达式 -- 下标引用操作符 --表达式求值2
【C语言】 操作符(下): -- 条件操作符 --逗号表达式 -- 下标引用操作符 --表达式求值2
|
编译器 C++
<<和>>操作符、取地址重载、const关键字
<<和>>操作符、取地址重载、const关键字

热门文章

最新文章