运行代码时,计算机在想什么

  • 计算机看到函数。
  1. void fortune_cookie(char msg[])
  2. {
  3. ...
  4. }

运行代码时,计算机在想什么 - 图1

  • 紧接着,计算机看到了函数的内容。
  1. printf("Message reads: %s\n", msg);
  2. printf("msg occupies %i bytes\n", sizeof(msg));

运行代码时,计算机在想什么 - 图2

  • 计算机调用函数。
  1. char quote[] = "Cookies make you fat";
  2. fortune_cookie(quote);

运行代码时,计算机在想什么 - 图3

运行代码时,计算机在想什么 - 图4要点

  • 数组变量可以被用作指针。

  • 数组变量指向数组中第一个元素。

  • 如果把函数参数声明为数组,它会被当作指针处理。

  • sizeof运算符返回某条数据占用空间的大小。

  • 也可以对某种数据类型使用sizeof,例如sizeof(int)

  • sizeof(指针)在32位操作系统中返回4,在64位操作系统中返回8。

 

这里没有蠢问题

问:sizeof是一个函数吗?

:不是,它是一个运算符。

问:有什么区别?

:编译器会把运算符编译为一串指令;而当程序调用函数时,会跳到一段独立的代码中执行。

问:所以程序是在编译期间计算sizeof的?

:没错,编译器可以在编译时确定存储空间的大小。

问:为什么在不同的计算机上指针变量的大小不同?

:在32位操作系统中,存储器地址以32位数字的形式保存,所以它叫32位操作系统。32位==4字节,所以64位操作系统要用8个字节来保存地址。

问:如果我创建了一个指针变量,它位于存储器中吗?

:是的,指针变量只不过是一个保存数字的变量罢了。

问:我可以找到指针变量的地址吗?

:可以用&运算符找到它的地址。

问:我可以把指针转化为一般的数字吗?

:在大多数操作系统中,可以这样做。C编译器通常会把long数据类型设为和存储器地址一样长。如果想要把指针p保存在long变量a中,可以输入a=(long)p,过几章我们会学习这种方法。

问:是在大多数操作系统中吗?所以并不是全部?

:并不是全部。

 

运行代码时,计算机在想什么 - 图5

三位钻石王老五准备参加今天的“非诚勿扰”。

今晚的幸运女嘉宾将从三位选手中选出她的白马王子,她会选谁呢?

运行代码时,计算机在想什么 - 图6

 

运行代码时,计算机在想什么 - 图7

三位钻石王老五准备参加今天的“非诚勿扰”。

今晚的幸运女嘉宾将从三位选手中选出她的白马王子,她会选谁呢?

运行代码时,计算机在想什么 - 图8