本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第3章,第3.9节,作者 蔡明志,更多章节内容可以访问云栖社区“异步社区”公众号查看
3.9 练习
指针的编程艺术(第二版)
1.试描述下列语句的意义。
(a) int (*p)[11];
(b) int *p[11];
(c) int **p;
2.有一个语句如下,
char str[ ][15] = {“Stanford”, “University”, “”};```
试说明为什么str + 1和*(str + 1) 所代表的意义是一样的呢?
3.有一个二维数组声明如下,
short int n = {10, 20, 30, 40, 50, 60, 70, 80, 90};`
请问下列各项表达式的输出结果是什么?是数组元素的地址(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.假设存在一个声明如下,
char *c[] = {“enter”, “new”, “point”, “first”};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;```
请问下列各项输出结果是什么(用%s输出,每一小题都有连贯性)?
(a) **++cpp
(b) *--*++cpp+3
(c) *cpp[-2]+3
(d) cpp[-1][-1]+1
5.有一个片段程序如下,
int arr[] = {100, 200, 300, 400, 500};
int *ptr = arr + 1;`
假设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.假设有一片段程序如下,
int arr2[][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};```
请问
(1) 表示数组中数值5的方法有哪些?
(2) 表示arr2[1][2] 元素地址的方法有哪些?
7.有一段程序如下,
char *str[4] = {“National”, “Chiao”, “Tung”, “University”};`
试回答下列问题:
(a) 可否使用str++将str指向下一个数组元素的地址?
(b) printf(“%c”, ((str + 3) + 4));
(c) printf(“%s”, *(str + 3));
(d) 如何输出NCTU这4个字?
8.请问下面程序的输出结果是什么。
(a)
/* practice.c */
#include <stdio.h>
#include <conio.h>
int main()
{
char str[][20] = {"Department",
"of",
"Information",
"Management" };
int i;
/* Output address */
printf("Output address of array element: \n");
for(i=0; i<4; i++)
printf("str+%d = %x\n", i, str+i);
printf("\n");
for(i=0; i<4; i++)
printf("*(str+%d) = %x\n", i, *(str+i));
printf("\n");
for(i=0; i<4; i++)
printf("str[%d] = %x\n", i, str[i]);
/* Output string or character */
printf("\n");
printf("Output string or character: \n");
for(i=0; i<4; i++)
printf("str[%d] = %s\n", i, str[i]);
printf("\n");
for(i=0; i<4; i++)
printf("*str[%d] = %c\n", i, *str[i]);
printf("\n");
for(i=0; i<4; i++)
printf("*(*(str+%d)) = %c\n", i, *(*(str+i)));
getch();
return 0;
}
(b)
/* practice8b.c */
#include <stdio.h>
#include <conio.h>
int main()
{
char str[][20] = {"Department", "of", "Information",
"Management"};
/* Output string or character */
printf("\n");
printf("*str[0]+3 = %c\n", *str[0]+3);
printf("\n");
printf("*(str[0]+3) = %c\n", *(str[0]+3));
printf("\n");
printf("*(*(str+2)+2) = %c\n", *(*(str+2)+2));
printf("\n");
printf("*(*(str+3)+4) = %c\n", *(*(str+3)+4));
getch();
return 0;
}
9.请问下面程序的输出结果是什么?
/* practice9.c */
#include <stdio.h>
#include <conio.h>
int main()
{
char str[][10] = {"computer", "printer", "monitor"};
char *pstr[] = {"computer", "printer", "monitor"};
printf("\n");
printf(" str[0] = %s\n", str[0]);
printf(" *pstr = %s\n", *pstr);
printf(" str[1] = %s\n", str[1]);
printf(" *(pstr + 1) = %s\n", *(pstr + 1));
printf(" str[2] = %s\n", str[2]);
printf(" *(pstr + 2) = %s\n", *(pstr + 2));
getch();
return 0;
}
10.有一段程序如下,
char *str[] = {“Object”, “Oriented”, “Programming”, “Language”};```
试回答下列问题:
(a) *(str + 3)以%s输出
(b) **(str + 3)以%c输出
(c) *(*(str + 3) + 3)以%c输出
(d) *(*str + 1)以%c输出
(e) **(str + 2) + 5以%c输出
11.有一段程序如下,
int j[] = {100, 200, 300, 400, 500};
int *pa[] = {j, j+1, j+2, j+3, j+4};
int **p2 = pa;`
请回答下列问题(有连续性)。
(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.请问下面程序输出结果是什么?
/* practice12.c */
#include <stdio.h>
#include <conio.h>
int main()
{
int i[5]={10, 20, 30, 40, 50};
int *ptr[] = {i, i+1, i+2, i+3, i+4};
int **p2 = ptr;
int k;
for(k=0; k<5; k++)
printf("i+%d = %x\n", k, i+k);
printf("\n");
for(k=0; k<5; k++)
printf("ptr[%d] = %x\n", k, ptr[k]);
printf("\n");
for(k=0; k<5; k++)
printf("ptr+%d = %x\n", k, ptr+k);
printf("\n");
printf("ptr = %x, p2 = %x\n\n", ptr, p2);
p2++;
printf("After executing p2++\n");
printf("p2=%x, ptr=%x, p2-ptr=%d, **p2=%d\n\n", p2, ptr, p2-ptr,
**p2);
*p2++;
printf("After executing *p2++\n");
printf("p2=%x, ptr=%x, p2-ptr=%d, **p2=%d\n\n", p2, ptr, p2-ptr,
**p2);
*++p2;
printf("After executing *++p2\n");
printf("p2=%x, ptr=%x, p2-ptr=%d, **p2=%d\n\n", p2, ptr, p2-ptr,
**p2);
++*p2;
printf("After executing ++*p2\n");
printf("p2=%x, ptr=%x, p2-ptr=%d, **p2=%d\n\n", p2, ptr, p2-ptr,
**p2);
getch();
return 0;
}
13.请问下面程序输出结果是什么?
/* practice13.c */
#include <stdio.h>
#include <conio.h>
int main()
{
char *str[]={"Taiwan", "Porland", "Philipine", "Hong Kong",
"England", "Sweden"};
char **pp[] = {str, str+1, str+2, str+3, str+4, str+5};
char ***ppp = pp;
int i;
for(i=0; i<6; i++)
printf("str[%d]=%s\n", i, str[i]);
printf("\n");
printf("%c", *(**ppp+2));
printf("%c", **(*ppp+1));
printf("%c", *(*(*ppp+2)+1));
printf("%c", *(*ppp[3]+6));
printf("%c", ppp[4][0][5]);
printf("%c", *(ppp[5][0]+2));
printf("\n");
getch();
return 0;
}
14.请问下面程序输出结果是什么?
/* practice14.c */
#include <stdio.h>
#include <conio.h>
int main()
{
char *str[]={"Taiwan", "Porland", "Philipine", "Hong Kong",
"England", "Sweden"};
char **pp[] = {str, str+1, str+2, str+3, str+4, str+5};
char ***ppp = pp;
int i;
for(i=0; i<6; i++)
printf("**(ppp+%d)=%s\n", i, **(ppp+i));
printf("\n");
printf("After **++ppp...\n");
printf("%s\n\n", **++ppp);
printf("After *--*++ppp...\n");
printf("%s\n\n", *--*++ppp);
printf("After *--*++ppp+2...\n");
printf("%s\n\n", *--*++ppp+2);
printf("After ++**ppp...\n");
printf("%s\n\n", ++**ppp);
printf("After ++**++ppp...\n");
printf("%s\n\n", ++**++ppp);
getch();
return 0;
}
15.有一段程序如下:
char *s[] = {“National”, “Chiao”, “Tung”, “University”};
char **sa[] = {s+3, s+2, s+1, s};
char ***p3 = sa;
试回答下列问题:
(a) printf(“%sn”, **p3);
(b) printf(“%cn”, (*(p3 + 1) + 2));
(c) printf(“%cn”, ((sa[2] + 2) + 1));
16.假设有一段程序test.c如下:
int main(int argc, char *argv[])
{
}```
如今test.c经过compile及link都无误,因而生成了test.obj及test.exe,假设其放在C:\目录下,之后在此目录下输入以下的数据。
C:>test Cambridge University UK`
请回答下列问题:
(1) argc为多少?
(2) *argv以%s输出。
(3) argv[1] + 2以%s输出。
(4) *(argv[1] + 2)以%c输出。
(5) ((argv + 1) + 2)以%c输出。