《指针的编程艺术(第二版)》一第二章 指针与变量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;
}

输出结果

程序中的

 `javascript
int *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。

而下一条语句

 `javascript
int * 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>
时间: 2024-09-22 09:52:11

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

《指针的编程艺术(第二版)》一3.5 指向数组的指针

3.5 指向数组的指针 指针的编程艺术(第二版)ptr[4] 和 (ptr)[4] 所表示的意义是不同的.ptr[4]已在前面讨论过了,而(*ptr)[4]是指向数组的指针(pointer to array){XE "指向陣列的指標(pointer to array)"},表示ptr是一指针,指向一个有4个元素的数组,其实它也可视为是一个二维数组ptr[][4],因为和[]是互通的,我们以范例pointerToArray-1来说明. 范例pointerToArray-1 / point

《指针的编程艺术(第二版)》一3.10 程序实战

3.10 程序实战 指针的编程艺术(第二版) 1.试以命令行参数,在命令行提示符的模式下,模拟两个整数的算术运算(加.减.乘.除)的功能,如下所示: calculate + 表示a加b的意思.而: calculate - 表示a减b的意思,其中a与b变量为已知.依此类推.

《指针的编程艺术(第二版)》一第三章 指针与数组3.1 指针与一维数组

第三章 指针与数组 指针的编程艺术(第二版) 3-1 指针与一维数组 3-2 指针与二维数组 3-3 数组指针 3-4 为什么parr等同于 *parr? 3-5 指向数组的指针 3-6 多重指针 3-7 命令行参数 3-8 改错题 3-9 练习 3-10 程序实战 指针其实就是一个地址.数组的名称,表示这个数组的第1个元素的地址,所以它也是指针.由此可知,指针与数组的关系是很密切的.为了与指针变量(pointer variable){XE "指標變數(pointer variable)&quo

《指针的编程艺术(第二版)》一3.2 指针与二维数组

3.2 指针与二维数组 指针的编程艺术(第二版) 一维数组与指针的关系前面已经介绍过.一维数组的元素值,可使用[]或一个*得到,假设有一个数组如下: int i[7] = {0, 1, 2, 3, 4, 5, 6}; int *ptr=i; 则(i+2) 或i[2] 或(ptr+2) 或ptr[2],都表示数组某一个元素的值.而二维数组(two dimension array){XE "二維陣列(two dimension)"},则需要两个,或一个与一个[ ],或两个[ ],才能得到数

《指针的编程艺术(第二版)》一3.4 为什么parr等同于 *parr?

3.4 为什么parr等同于 *parr? 指针的编程艺术(第二版) 因为一个指针相当于一维数组,所以可将上述的数组指针 char *parr[4] = {"Department", "of", "Information", "Management"}; 改为以二维数组的方法表示,如下语句所示. char parr[4][12] = {"Department", "of", "

《指针的编程艺术(第二版)》一第一篇 C语言篇

第一篇 C语言篇 指针的编程艺术(第二版)C语言最早是在AT&T(American Telephone and Telegraph,美国电话与电报公司)内部使用的语言,但为了发布UNIX操作系统,不得不公开这一程序语言.主导这语言的两个灵魂人物,分别是Dennis Ritchie与Brian Kernighan.ANSI C已于1989年公布.Dennis Ritchie生于1941年,哈佛大学数学博士,是C语言之父.Brian Kernighan目前在普林斯顿大学计算器科学系(Departme

《指针的编程艺术(第二版)》一2.4 练习

2.4 练习 指针的编程艺术(第二版)1.请问下面程序的输出结果是什么?并说明其含义. /* exercise2-1.c */ #include <stdio.h> #include <conio.h> int main() { char *diamond="拉钻石"; char *p1 = diamond; char **p2 = &p1; char ***p3 = &p2; printf("diamond=%p\n", d

《指针的编程艺术(第二版)》一3.6 多重指针

3.6 多重指针 指针的编程艺术(第二版)多重指针(multiple pointer){XE "多重指標(multiple pointer)"},指的是在一个语句中有2个或以上的*.我们以范例starstarPointer-3来说明. 范例starstarPointer-3 /* starstarPointer-3.c */ #include <stdio.h> #include <conio.h> int main() { int i[5]={10, 20,

《指针的编程艺术(第二版)》一第一章 内存的基本概念1.1 变量

第一章 内存的基本概念 指针的编程艺术(第二版)1-1 变量 1-2 一维数组 1-3 二维数组 1-4 结构 1-5 练习 当程序定义一个变量时,编译程序根据其数据类型分配适当大小的内存给它,以便存储数据.这就如同地址一般,邮差根据收件人的地址,将信件投入正确的信箱. 1.1 变量 指针的编程艺术(第二版)程序以变量名称代表某一事项,就好比每一个人都有姓名一般.如果有人喊"蔡明志",那我一定会说"到",因为这个名字就代表我的意思.我们就从变量开始谈起.请参阅范例a