本文共 6291 字,大约阅读时间需要 20 分钟。
本节书摘来自异步社区《指针的编程艺术(第二版)》一书中的第3章,第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};`
(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/