《指针的编程艺术(第二版)》一第二章 指针与变量2.1 一颗星星:表示一把钥匙...

    xiaoxiao2023-12-19  156

    本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第2章,第2.1节,作者 蔡明志,更多章节内容可以访问云栖社区“异步社区”公众号查看

    第二章 指针与变量

    指针的编程艺术(第二版)2-1 一颗星星:表示一把钥匙

    2-2 两颗星星:表示两把钥匙

    2-3 三颗星星:表示三把钥匙

    2-4 练习

    如果要间接访问某一变量值,我们可使用指针来完成。

    2.1 一颗星星:表示一把钥匙

    指针的编程艺术(第二版)本章将介绍指针变量(pointer variable)与一般变量的关系。首先介绍的是,如何定义一个指针变量,如下所示。

    int x=100; int *ptr = &x;

    上述语句表示下列3种含义。

    1.ptr是一个指针变量。

    2.ptr变量所存储的数据是某一个变量的地址(假设是整数变量x的地址)。

    3.使用ptr可以得到整数变量x的值。你可以把 比喻成一把钥匙,用它来打开当前ptr指向的信箱,而得到该信箱内的信件。

    先来看看范例onePointer。

    范例onePointer

    /* onePointer.c */ #include <stdio.h> #include <conio.h> int main() {   int x = 100, y = 200;   int *ptr = &x;   printf("x变量所在的地址为 %p, 值为 %d\n", &x, x);   printf("y变量所在的地址为 %p, 值为 %d\n", &y, y);   printf("ptr变量所在的地址为 %p\n\n", &ptr);   printf("ptr变量里面所放的内容为 %p\n", ptr);   printf("x = %d, *ptr = %d\n\n", x, *ptr);   ptr = &y;   printf("ptr变量里面所放的内容为 %p\n", ptr);   printf("y = %d, *ptr = %d\n", y, *ptr);   getch();   return 0; }

    输出结果

    程序中的

     `javascriptint *ptr = &x;

    其实是下列两条语句的组合   ```javascript int *ptr ;   ptr = &x;

    表示将&x赋值给ptr,而不是将地址(&x)赋给值(ptr),否则会造成两边的数据类型不同。程序使用ptr间接地得到x的值。间接访问的过程很像间谍(spy)的工作,他们不会直接指派工作,这样才不会暴露彼此之间的关系。

    强烈建议大家画出程序定义的示意图,例如,下图为ptr = &x的示意图,你可以很容易的从图形中看出实质。

    最后,将&y赋值给ptr。

    其示意图如下所示。

    如果将指针与const共享,则应该注意什么?请参阅范例constPointer。

    范例constPointer

    /* constPointer.c */ #include <stdio.h> #include <conio.h> int main() {   int a=100, b=200;   const int *p = &a;   int * const q = &b;   printf("a=%d, *p=%d\n", a, *p);   printf("b=%d, *q=%d\n", b, *q);      /* 不可使用*p 间接更改变量a的值   *p=b;   */      /* 但可以将p指针指向另一变量的地址 */   p=&b;   printf("*p=%d\n", *p);      /*===========================*/        /* 不可更改 q 指针指向另一变量的地址   q=&a;   */      /* 但可以使用q指针间接更改变量b的值 */   *q=888;   printf("*q=%d\n", *q);   getch();   return 0; }

    输出结果

    程序中 const int *p = &a;

    这条语句的示意图如下所示。

    这条语句表示p指针指向变量a的地址。因为const 写在int的前面,表示不可以使用p指针间接改变变量a的值,如p=200。但可以改变p指针指向另一变量,如p=&b。

    而下一条语句

     `javascriptint * const q = &b;

    图像说明文字 <div style="text-align: center"> <img src="https://yqfile.alicdn.com/2057efb106a833eb96fe3eb92a541c3050e13b65.png" > </div> 这条语句表示q指针指向变量b的地址。因为const写在q的前面,所以不可以把另一个变量的地址赋值给q指针,如q=&a。但可以改变*q的值,如将变量b的值改为888,则可使用*q=888来完成。 另外一种情况const int * const p = &a; 是表示: 1.不能通过*p间接更改变量a的值; 2.也不能再把另一变量的地址赋值给p指针。 这条语句的示意图如下。 <div style="text-align: center"> <img src="https://yqfile.alicdn.com/06aff00cb977875c988b5f957fe9ec70064c80ee.png" > </div>
    最新回复(0)