本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第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:>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输出。