博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《指针的编程艺术(第二版)》一3.9 练习
阅读量:5955 次
发布时间:2019-06-19

本文共 6291 字,大约阅读时间需要 20 分钟。

本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第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]+15.有一个片段程序如下,

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 
#include
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 
#include
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 
#include
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 
#include
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 
#include
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 
#include
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输出。

转载地址:http://oclxx.baihongyu.com/

你可能感兴趣的文章
QQ 的登录封面是怎么设计的
查看>>
eas之Uuid和BOSUuid 区别
查看>>
大数据培训:小白如何学好大数据
查看>>
一些看起来有用但没用过的函数
查看>>
解释清楚智能指针二【用自己的话,解释清楚】
查看>>
【Javascript第二重境界】序
查看>>
python-argparse使用
查看>>
PHP支付宝手机网站支付功能
查看>>
微信小程序css篇----flex模型
查看>>
【转载】IL指令集
查看>>
Linux 常用名利总结
查看>>
C#winform控制textbox输入只能为数字
查看>>
每天一道算法题(13)——使用递归颠倒栈
查看>>
一些Layout的坑
查看>>
hbase源码系列(八)从Snapshot恢复表
查看>>
Spring Boot学习总结(1)——Spring Boot入门
查看>>
tab控件的使用心得
查看>>
Windows下提升进程权限(转)
查看>>
Struts2标签实现for循环
查看>>
实验3 OpenGL几何变换
查看>>