9.2 变量的指针和指向变量的指针变量

9.2 变量的指针和指向变量的指针变量

  • 一.指针变量的定义
  • 二.指针变量的引用
  • 三.整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记

9.2 变量的指针和指向变量的指针变量_第1张图片

一.指针变量的定义

变量的指针 就是变量的地址。 我们可以定义一个指向 变量 的指针变量。
这种指针变量,我们在定义的时候,会引入一个*在定义的语句中,表示“这是一个指针变量”。

指针变量定义的一般形式:

类型标识符    *标识符                             标识符:就是指针变量名字
int i,j ;  //普通变量
float k;  //普通变量
int *mypoint1,*mypoint2;     //定义两个指针变量,这两个指针变量    指向整型变量的。
                            //指针变量定义时  变量名前面有个*,这个是和普通变量最明显的区别。
float *pm3;   //指向实型变量的指针
float *pm4;   //指向实型变量的指针

如何让一个整型指针变量 指向 一个整型变量,可以用赋值语句使一个整型指针变量 指向 一个整型变量(普通变量)。

mypoint1 = &i;     //&地址符        等价于mypoint1指向了i
mypoint2 = &j;    //等价于mypoint2指向了j

说明:
1.定义指针变量的时候,指针变量前是有“”的,表示这是正在定义一个指针变量,
但是,我用指针变量,指针变量名前是没有"
"的。多以,指针变量名是mypoint1,mypoint2,而不是*mypoint1,*mypoint2。
2.一个指针变量只能指向同一个类型的类型的变量(普通变量);

pm3 = &i;     //编译错误

在这里插入图片描述

vs中 调试——窗口——内存 可查看内存地址。

二.指针变量的引用

牢记:指针变量中只存放地址。不要将一个整型变量赋值给一个指针变量;

mypoint = 4;    //mypoint是一个指针变量,4是一个整数

和指针变量相关的运算符有两个:
(1)& :取地址符
(2)* :指针运算符(间接访问运算符),
2.1 乘法运算符 34
2.2定义指针变量的时候,我们用到
,这个叫指针运算符;
但是,若这个
不出现在指针定义的场合,而且也不是个乘法运算符,那么这个*依旧是指针运算符。只不过代表的是该指针变量所指向的变量。

int a,b;
int *p1,*p2;    //*表示这两个变量是指针变量。
a =100;
b = 200;
p1 = &a;     //把变量a的地址赋给了p1;     ********现在p1指向了a;
p2 = &b;     //把变量b的地址赋给了p2;     ********现在p2指向了b;
printf("%d,%d\n",a,b);         //*不用于指针定义的场合,代表的是它指向的变量
printf("%d,%d\n",*p1,*p2);    //*p1 ===> a       *p2  ====>  b

9.2 变量的指针和指向变量的指针变量_第2张图片
9.2 变量的指针和指向变量的指针变量_第3张图片

解析:
1.
&*p1 : &是取址运算符,*是指针运算符。根据上表,这两个运算符优先级相同,但是他们运算符是自右向左结合的。

         所以先看*p1,*p1代表的是p1所指向的变量,其实就是a,那么再执行&运算,其实  &*p1等价于&a;
         又因为&a它本身就是p1,所以&*p1等于啥也没干。
        p1= &*p1;     // ==>&a
        p2= &*p1;    //==>指针变量p2指向了a
   2.    *&a     :  &是取址运算符,*是指针运算符。根据上表,这两个运算符优先级相同,但是他们运算符是自右向左结合的。
         所以先看&a,也就是p1,再进行*运算,*&a ==>*p1,*p1代表的是p1指向的变量,也就是a,所以*&a ==> a。
   3.    (*p1)++  :    *p1是a,所以(*p1++)是a++
(*p1)++;
a;
         *p1++       :  因为  ++和*同级,又是从右到左结合。所以 *p1++ 等价于*(p1++)
           p1++
            地址是个数字,地址加1的意思如下:
            如果普通整型变量i,i++,i =4;则i = 5;就是i这个变量对应的内存中的内容+1;
            同理,指针变量自+1,也肯定是这个指针变量中的内容要自加,但是这种本来是自加1的操作,对于指针来讲就不一定是自加1;自加几,取决于该指针变量所指向的变量类型,如果p1指向的是整型变量,那么p1++的内容要加4;因为int是4个字节。
            p1++意味着p1指向i之后的变量,要完整跳过4个字节,所以p1++后内容如下

9.2 变量的指针和指向变量的指针变量_第4张图片
9.2 变量的指针和指向变量的指针变量_第5张图片

    *(p1)++    不再指向a,他就指向a后边的内存,这段内存不知道是谁的,所以 *(p1)++ 这个动作非常危险,因为你会改变不属于你的内存;
p1;
p1++;
*p1 = 45;      //极度危险,留下隐患,因为这段内存0x0024F9A8不属于你,你却把这段内存中的值覆盖了。
int *pmax,*pmin,*p,a,b;    //pmax指向大的值,pmin指向小的值
a = 5;
b =8;
pmax = &a;
pmin = &b;
if(a < b)
{
    //为了演示指针变量的赋值,
    p = pmax;
    pmax = pmin;  //现在P指向a(指向了大的值)
    pmin = p;       //pmin指向a(指向了小的值)
}
printf("a = %d,b = %d\n",a,b);        
printf("max = %d,min = %d\n",*max,*min);    

9.2 变量的指针和指向变量的指针变量_第6张图片

三.整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记

你可能感兴趣的:(C语言,c语言,指针)