大家好,今天小编关注到一个比较有意思的话题,就是关于c语言指针的运算符的问题,于是小编就整理了2个相关介绍c语言指针的运算符的解答,让我们一起看看吧。
c语言的指针中*操作符的本质是什么?
*操作符在变量声明时的本质是要求C语言提供一个“盒子”,里面保存另一个“盒子”的位置标签。当你读取这个盒子里的内容,就知道另一个盒子在哪里。*操作符在变量引用时表示根据盒子里的另一个盒子的位置,把另一个盒子里的内容取出来(或存进去)。
*是解引用运算符,它对一个指针起作用,效果是返回该指针指向的地址对应的左值。然后你就可以对这个左值读取、赋值了。这就是标准的理解方法,不要看些博客文章有的没的发明的新名词。
> int ch;> int *cp;> *(cp+1)作为左值是合法的>但是(cp+1)就不能作为左值
(cp+1)操作返回的是右值,类型是int*,因为它返回的东西是个临时的指针变量,当然是右值。所以你需要解引用才能将其变成int类型的左值。或者你可以把它保存成一个具名的变量(比如说 int* cp2 = cp + 1;),变成int*类型的左值。
似乎C语言那边比较倾向于特殊对待指针这个东西,比如理解 int *p; 这种声明的时候倾向于理解为“类型是int,声明一个指向该类型的指针p”。不过以我个人经验,你跟C++一样把指针就当成类型系统的一部分其实是更好理解的。比如刚才那个p,类型就是int*,干干脆脆。你在C++里用到各种template各种type_traits的时候编译器也确实是这么处理的。Stroustrup老爷子也是建议写int* p; int* q; 而不是int *p, *q;。
解引用操作符。
举个例子,定义一个指针 int *p = &a;
我们知道p是一个指针,指向了变量a,那我要通过p来访问a代表的那块内存、也就是p指向的那块内存怎么办?*p就表示p指向的那块内存保存的数据。
在汇编来说char * c和 int x 都是一样的变量,即是栈,细点来说一个保存地址的栈,一个是保存数据的栈,其实都是数据,以汇编的角度来说。int x 一样可以和char *保存地址 mov eax ,&p;mov x,eax,;而char * c不过是lea eax,p;mov c,eax。至于var=*c 之类的取值即是lea eax,c;mov var,byte [eax],这就是本质。
1.指针类型的定义和声明,例子:int *p; 这个代表声明一个int类型的指针,它指向一个int类型的数据;
2.解引用,就是将地址或者内存中的内容拿出来,用于用户操作,例子:int* p=“I love china”;*p内容是I,如果想要访问所有的内容,***用指针的加减运算即可
取地址运算符和指针运算符?
这两个运算符功能是互逆的 比如现在有int型变量a,a值是100,a在内存中的地址是0x012FA7A6 * 就是给定地址求值,即已知0x012FA7A6,求出对应值100 & 就是给定变量,求地址,即要得到对应a的地址
到此,以上就是小编对于c语言指针的运算符的问题就介绍到这了,希望介绍关于c语言指针的运算符的2点解答对大家有用。