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

    xiaoxiao2024-03-22  126

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

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)