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

简介:

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

相关文章
|
6月前
C进阶:指针的练习(1)
C进阶:指针的练习(1)
|
C++
关于指针,你不可以错过的练习(c/c++)
关于指针,你不可以错过的练习(c/c++)
61 0
|
6月前
|
C语言
C语言指针——练习
C语言指针——练习
|
5月前
|
C++
指针习题练习
指针习题练习
21 0
|
6月前
指针应用基础练习
指针应用基础练习
38 0
|
6月前
|
存储 人工智能
指针的应用练习(数组与指针的关系)
指针的应用练习(数组与指针的关系)
42 0
|
C语言 C++
【C语言进阶】 指针强化练习(二)
【C语言进阶】 指针强化练习(二)
57 0
|
6月前
|
存储 搜索推荐
【C/PTA】指针专项练习(二)
【C/PTA】指针专项练习(二)
114 0
|
6月前
【C/PTA】指针专项练习(一)
【C/PTA】指针专项练习(一)
93 0
|
6月前
|
人工智能 编译器 C语言
C语言:指针详解【图解 + 练习】
C语言:指针详解【图解 + 练习】