天天看点

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

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

指针的编程艺术(第二版)

1.试描述下列语句的意义。

(a) int (*p)[11];

(b) int *p[11];

(c) int **p;

2.有一个语句如下,

  short int n = {10, 20, 30, 40, 50, 60, 70, 80, 90};<code>`</code>

请问下列各项表达式的输出结果是什么?是数组元素的地址(address),还是数组元素的值(value)?(假设n数组起始地址为1010)

(1) n

(2) *n

(3) **n

(4) n[2]

(5) n2

(6) *n[2]+1

(7) *(n+1)

(8) **(n+2)

(9) n[2]+2

(10) *(n[1]+2)

(11) (n+2)

4.假设存在一个声明如下,

int arr[] = {100, 200, 300, 400, 500};

int *ptr = arr + 1;<code>`</code>

假设arr数组的起始地址为22ff50,而ptr的内存地址为22ff,试回答下列题目,并注明是地址还是值。

(a) arr[2] = ?

(b) *(arr + 2) = ?

(c) arr + 2 = ?

(d) ptr + 2 = ?

(e) *(ptr + 2) = ?

(f) ptr[0] = ?

(g) ptr + 2和 (ptr + 2)意义一样吗?试说明。

(h) ptr++和++ptr的意义一样吗?试说明。

(i) ptr + 1和ptr++意义一样吗?试说明。

(j) 此范例可以使用arr++表示吗?为什么?

6.假设有一片段程序如下,

char *str[4] = {“national”, “chiao”, “tung”, “university”};<code>`</code>

试回答下列问题:

(a) 可否使用str++将str指向下一个数组元素的地址?

(b) printf(“%c”, ((str + 3) + 4));

(c) printf(“%s”, *(str + 3));

(d) 如何输出nctu这4个字?

8.请问下面程序的输出结果是什么。

(a)

(b)

9.请问下面程序的输出结果是什么?

10.有一段程序如下,

int j[] = {100, 200, 300, 400, 500};

int *pa[] = {j, j+1, j+2, j+3, j+4};

int **p2 = pa;<code>`</code>

请回答下列问题(有连续性)。

(a) printf(“%dn”, ((p2 + 1) + 1));

(b) printf(“%dn”, ((pa + 2) + 2));

(c) printf(“%dn”, *(pa[3] + 1));

(d) printf(“%dn”, **p2++);

(e) printf(“%dn”, **p2);

12.请问下面程序输出结果是什么?

13.请问下面程序输出结果是什么?

14.请问下面程序输出结果是什么?

(a) printf(“%sn”, **p3);

(b) printf(“%cn”, (*(p3 + 1) + 2));

(c) printf(“%cn”, ((sa[2] + 2) + 1));

16.假设有一段程序test.c如下:

c:&gt;test cambridge university uk<code>`</code>

请回答下列问题:

(1) argc为多少?

(2) *argv以%s输出。

(3) argv[1] + 2以%s输出。

(4) *(argv[1] + 2)以%c输出。

(5) ((argv + 1) + 2)以%c输出。

继续阅读