指针带来的一些符号的理解

 指针带来的一些符号的理解


     
 我们写的代码是给编译器看的,代码要想达到你想象的结果,就必要编译器对你的代码的理解和你自己对代码的理解一样。编译器理解代码就是理解的符号,所以我们要正确理解C语言中的符号,才能像编译器一 样思考程序、理解代码。
 
 星号*
      (1) C语言中*可以表示乘号,也可以表示指针符号。这两个用法是毫无关联的,只是恰好用了回一个符号而已。

      (2) 星号在用于指针相关功能的时候有两种用法:第一种是指针定义时,*结合前面的类型用于表明要定义的指针的类型
                        第二种功能是指针解引用,解引用时*p表示p指向的变量本身

取地址符&
      (1)取地址符使用时直接加在个变量的前面, 然后取地址符和变量加起来构成一 个新的符号,这个符号表示这个变量的地址

指针定义并初始化、与指针定义然后赋值的区别
  (1)指针定义时可以初始化,指针的初始化其实就是给指针变量赋初值(跟普通变量的初始化没有任何本质区别) 
  (2)指针变量定义同时初始化的格式是:int a = 32 ,int *p = &a; 

                   不初始化时指针变量先定义再赋值;int a = 32;  int *p; p = &a; 正确

                             *p=&a; 错误

#include <stdio.h>

void main()
{
      int a = 23;
      int b = 0;

      int *p;     //*p就是我们说星号的第一种用法,其实是 (int*)  p,定义一个整型指针变量p 
      
      p = &a;

      b = *p;     //*p就是我们说星号的第二种用法,实质就是 星号 这个钥匙打开了p指向存储a的地址,得到了a的值

      printf("b = %d
",b);
}    

左值与右值

(1)放在赋值运算符左边的就叫左值,右边的就叫右值。所以赋值操作其实就是:左值 = 右值;

(2)当一个变量做左值时,编译器认为这个变量符号的真实合义是这个变量所对应的那个内存空间:当一个变量做右值时,编译器认为这个变量符号的真实含义是这个变量的值,也就是这个变量所对应的内存空间中存储的那个数。

(3)左值与右值的区别,就好象现实生活中“家"这个字的含义。譬如“我回家了”,这里面的家指的是你家的房子(类似于左值) :但是说“家比事业重要”,这时候的家指的是家人(家人就是住在家所对应的那个房子里面的人,类似于右值)

#include <stdio.h>
int main(void)
{
      int a =3, b=5;
      a =b;  //当a做左值时,我们关心的是a所对应的内存空间,而不是其中存储的3
      b=a;   //当a做右值时,我们关心的是a所对应空间中存储的数,也就是5
      
      return  0 ;
}
原文地址:https://www.cnblogs.com/sanshijvshi/p/10274894.html