当前位置:文档之家› 10 第6章 数组与指针— 指针

10 第6章 数组与指针— 指针

C语言程序设计实验答案数组、指针与字符串

实验06 数组、指针与字符串(4学时) (第6章数组、指针与字符串) 一、实验目的 二、实验任务 6_1(习题6-25)编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。 6_2(习题6-26)使用动态内存分配生成动态数组来重新完成上题(n阶方阵),使用指针实现函数的功能。 6_3 编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 6_4 使用string类声明字符串对象,重新实现上一小题。 6_5(习题6-27)声明一个Employee类。 其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。 6_6(习题6-27)声明包含5个元素的对象数组,每个元素都是Employee 类型的对象。 6_7 修改实验4中的people(人员)类。 具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。其中“出生日期”声明为一个“日期”类内嵌子对象。 用成员函数实现对人员信息的录入和显示。 要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。 在测试程序中声明people类的对象数组,录入数据并显示。

三、实验步骤 1.(编程,习题6-25)编写矩阵转置函数,输入参数为3×3整型数组。 使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入输出。程序名:lab6_1.cpp。 参考运行结果: ★程序及运行结果: //lab6_1.cpp #include using namespace std; void move(int matrix[][3]){ int temp; for(int i=0;i<3;i++) for(int j=0;j>mat[i][j]; } cout<<"\n输入的3×3矩阵为:"<

C语言字符串指针问题

C语言字符串指针问题 在C语言中,可以用两种方法访问一个字符串。 用字符数组存放一个字符串,然后输出该字符串。 1.main(){ 2.char string[]=”I love China!”; 3.printf("%s\n",string); 4.} 说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。 用字符串指针指向一个字符串。 1.main(){ 2.char *string=”I love China!”;

3.printf("%s\n",string); 4.} 字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p=&c; 表示p是一个指向字符变量c的指针变量。而: char *s="C Language"; 则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入string。程序中的:char *ps="C Language"; 等效于: char *ps; ps="C Language"; 输出字符串中n个字符后的所有字符。 1.main(){ 2.char *ps="this is a book";

3.int n=10; 4.ps=ps+n; 5.printf("%s\n",ps); 6.} 运行结果为: book 在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。 在输入的字符串中查找有无‘k’字符。 1.main(){ 2.char st[20],*ps; 3.int i; 4.printf("input a string:\n"); 5.ps=st; 6.scanf("%s",ps); 7.for(i=0;ps[i]!='\0';i++) 8.if(ps[i]=='k'){ 9.printf("there is a 'k' in the string\n"); 10.break; 11.} 12.if(ps[i]=='\0') printf("There is no 'k' in the string\n");

第七章字符数组与指针练习题参考答案

第七章字符数组与字符串 【题7.29】下面是对s的初始化,其中不正确的是。 A)char s[5]={“abc”};B)char s[5]={‘a’,‘b’,‘c’}; C)char s[5]=“”;D)char s[5]=“abcdef”; 【题7.30】下面程序段的运行结果是。 char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’}; printf(“%s”,c); A)‘a’‘b’ B)ab C)ab c 【题7.31】对两个数组a和b进行如下初始化 char a[]=“ABCDEF”; char b[]={‘A’, ‘B’,‘C’,‘D’,‘E’,‘F’}; 则以下叙述正确的是。 A)a与b数组完全相同B)a与b长度相同 C)a和b中都存放字符串D)a数组比b数组长度长 提示:‘\0’是字符串结束的标志 【题7.32】有两个字符数组a、b,则以下正确的输入格式是。 A)gets(a,b); B)scanf(“%s %s”,a,b); C)scanf(“%s %s”,&a,&b);D)gets(“a”),get(“b”); 【题7.33】有字符数组a[80]和b[80],则正确的输出形式是。 A)puts(a,b); B)printf(“%s %s”,a[],b[]); C)putchar(a,b); D)puts(a),puts(b); 【题7.34】下面程序段的运行结果是。 char a[7]=“abcdef”; char b[4]=“ABC”; strcpy(a,b); printf(“%c”,a[5]); A)空格B)\0 C)e D)f 提示:复制后a[0]=‘A’,a[1]=‘B’,a[2]=‘C’,a[3]=‘\0’, a[4]=‘e’,a[5]=‘f’, a[6]=‘\0’,

计算机二级c语言第九章 数组和指针习题与答案

第九章数组和指针 1、有以下程序 main() { int a[]={2,4,6,8,10}, y=0, x, *p; p=&a[1]; for(x= 1; x< 3; x++) y += p[x]; printf("%d\n",y); } 程序运行后的输出结果是 A)10 B)11 C)14 D)15 2、有以下程序 void sum(int a[]) { a[0] = a[-1]+a[1]; } main() { int a[10]={1,2,3,4,5,6,7,8,9,10}; sum(&a[2]); printf("%d\n", a[2]); } 程序运行后的输出结果是 A)6 B)7 C)5 D)8 3、有以下程序 main() { int p[8]={11,12,13,14,15,16,17,18},i=0,j=0; while(i++< 7) if(p[i]%2) j+=p[i]; printf("%d\n",j); } 程序运行后的输出结果是 A)42 B)45 C)56 D)60 4、设有定义语句 int x[6]={2,4,6,8,5,7},*p=x,i; 要求依次输出x数组6个元素中的值,不能完成此操作的语句是 A)for(i=0;i<6;i++) printf("%2d",*(p++)); B)for(i=0;i<6;i++) printf("%2d",*(p+i)); C)for(i=0;i<6;i++) printf("%2d",*p++); D)for(i=0;i<6;i++) printf("%2d",(*p)++); 5、有以下程序 #include < stdio.h > main() { int a[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL; *q=*(p+5); printf("%d %d\n",*p,*q); } 程序运行后的输出结果是 A)运行后报错 B)6 6 C)6 11 D)5 10

字符数组,字符指针,sizeof,strlen总结

[cpp] 字符数组,字符指针,sizeof,strlen总结 作者:Hui Wang来源:博客园发布时间:2011-03-26 14:22 阅读:728 次原文链接[收藏]对于字符数组与字符指针: 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0". 2. 字符串直接量作为字符指针的初始值 "hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用, 即使程序中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于const char *ptr = “hello”; 字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1] = …a?;是会引起错误的。 3. 字符串直接量作为基于栈的字符数组的初始值 由于基于栈的变量不可能引用其他地方存储的内存,编译器会负责将字符串直接量复制到基于栈的数组内存中。 例如: char stackArray[] = “hello”; 做如下修改: stackArray[1] = …a?;是真确的。 4. 字符数组与字符指针 字符数组的形式如下,会将字符直接量拷贝到栈上: char str[] = "abc"; // 实际的数据存储: a b c \0,也就是增加了一个终结符\0 char str[3] = {'a','b','c'}; // 实际的数据存储: a b c,并没有在最后添加终结符 char str[10] = {'a','b','c'}; // 实际的数据存储: a b c \0 \0 \0 \0 \0 \0 \0 字符指针的形式如下: char *str = “abc”;// 实际的数据存储: a b c \0,也就是增加了一个终结符\0 5. 类型的决定 1). 数组的类型是由该数组所存放元素的类型以及数组本身的大小决定的 如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。 2). 字符串常量的类型可以理解为相应字符常量数组的类型 如"abcdef"的类型就可以看成是const char[7],也就是说实际的数据存储为"abcdef\0"。 3). 函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型

第4章 指针思考与练习题答案

第4章指针 思考与练习题 1、什么叫内存单元的地址?什么叫指针? 答:在计算机内部的存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址。内存单元的编号,称为内存单元的地址。 在C++语言中,内存单元的地址称为指针。 2、什么叫指针变量?什么叫指针的目标? 答:专门用来存放地址的变量,称为指针变量(pointer variable)。指针指向的内存区域中的数据称为指针的目标。 3、什么叫空指针?其作用是什么? 答:所谓空指针就是指针变量的内容为零的状态。 4、指针运算的实质是什么? 答:指针运算是以指针变量所存放的地址量作为运算量而进行的运算。因此,指针运算的实质就是地址的计算。 5、指针有哪些运算?请枚举这些计算。 答:指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。 6、什么叫数组的指针?什么叫指针数组的指针? 答:在C++语言中,数组的指针是指数组在内存中的起始地址。 指针变量数组和普通的一般变量数组一样,编译系统在处理指针数组说明时,按照指定的存储类型为它在内存中分配一定的连续存储空间,这时指针数组名就表示该指针数组的存储首地址,即指针数组的指针。 7、什么叫二级指针变量?什么叫多级指针变量? 答:对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。我们把一个指向指针变量的指针变量,称为多级指针变量。 8、new运算符的作用是什么?delete运算符的作用是什么? 答:运算符new主要用于分配内存,并获得分配到的内存的首地址,通常需要将其赋给相应数据类型的指针。如果程序中不再需要由new分配的内存空间时,用运算符delete

指针经典练习题及答案

二、程序题 1、计算字符串中子串出现的次数。要求:用一个子函数subString()实现, 参数为指向字符串和要查找的子串的指针,返回次数。 2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。 算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e), Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。 例如,China转换成密文为G l m r e。 要求:在函数change中完成字母转换,在函数insert中完成增加空格, 用指针传递参数。 3、字符替换。要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E), 并返回替换字符的个数。 4、编写一个程序,输入星期,输出该星期的英文名。用指针数组处理。 5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列, 再分别取出每个字符串的第三个字母合并成一个新的字符串输出 (若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。 6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值, 然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较, 输它们相同的数字个数(使用动态内存分配)。 /*1、计算字符串中子串出现的次数。要求:用一个子函数subString()实现, 参数为指向字符串和要查找的子串的指针,返回次数。*/ #include int subString(char *a, char *b) { int i = 0; int j = 0; int m = 0; char *p = b; while(*a) { while(*a) { if(*a == *b) { break; } a++; } while(*b) { if(*a != *b)

指针和数组习题

一、1 数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值。() 2. 取数组a的第5个元素的地址,正确的写法是() A) *a[4] B) &a[4]C) a[4] D) *(a+4) 3. 程序段输出结果是() int main() { double number = 12345.12345678; cout << setw(10) << setprecision(5) << number << endl; cout << setw(10) << setprecision(10) << number << endl; return 0; } 12345 B)12345 C) 12345 D) 12345 12345.12346 12345.12345 12345.12345 12345.1235 4、若x为整形变量,p是基类型为整形的指针变量,则正确的赋值表达式() A p=&x B p=x C *p=&x D *p=*x 5,设p1和p2均为指向同一个int型一维数组的指针变量,k为int型变量,下列不正确的语句是() A k=*p1+*p2 B k=*p1*(*p2) C p2=k D p1=p2 6.对于相同类型的指针变量,不能进行()运算。 A,+ B,- C,= D,== 7.有函数定义如下,则其返回值为() int *f(int a) { Int*p,n; n=a; p=&n; return p; } A 一个不可用的存储单元地址值 B一个不可用的存储单元地址值 C n中的值 D 形参a中得值 8,下列关于字符串的描述中,错误的是() A,一维字符数组可以存放一个字符串 B,可以用一个字符串给二维字符数组赋值 C,二维字符数组可以存放多个字符串 D;可以用一个字符串给二维字符数组进行初始化 9;下列关于字符数组的描述中,错误的是() A.字符数组中得每一个元素都是字符 B,字符数组可以使用初始值表进行初始化 C,字符数组可以存放字符串 D 字符数组就是字符串 10;下列关于数组下标的描述中,错误的是() A;C++中,数组元素的下标是从0开始的 B,数组元素下标是一个整型常量表达式

第8章 指针-3字符数组和字符指针 - 字符串的表示与存储

第8章指针——字符数组与字符指针:字符串的表示与存储

printf("How are you"); H o w a r e y o u \0

printf("How are you.\n "); printf("\"How are you.\"\n"); How are you. _ printf("How are you. Press \ a key and then press Enter:\n"); How are you. Press a key and then press Enter: _ "How are you." _ printf("How are you. Press " "a key and then press Enter:\n"); 问题:如果字符串太长,怎么表示?

?C语言没有提供专门的字符串数据类型 ?字符数组——每个元素都是字符类型的数组 H o w a r e y o u 0 H o w a r e y o u \0

?字符数组的定义 #define STR_LEN 80 char str[STR_LEN+1]; ?字符数组的初始化 用字符常量的初始化列表对数组初始化 char str[6] = {'C','h','i','n','a','\0'}; 用字符串常量直接对数组初始化 char str[6] = {"China"}; char str[6] = "China"; char str[ ] = "China"; char char str[10] = "China";

?字符指针就是指向字符串首地址的指针 ?定义一个字符指针,使其指向一个字符串常量 H e l l o C h i n a \0

字符串指针和字符数组,静态全局、静态局部、全局和局部变量区别,字符串常量和字符串变量,程序的内存分配

最近工作之余,发现了两个自己在C语言学习中的难点,一个是字符串指针和字符数组的区别,一个就是静态全局变量、静态局部变量、全局变量和局部变量的区别,在网上查了不少资料,收获良多,现在与大家分享,有错误的地方请大家指正! 以下程序用VC++6.0调试 先说说字符串指针和字符数组的区别 1.相同点: /* 用字符数组实现字符串操作*/ main( ) { char str[]="Welcome to study C !"; int i; printf("%s\n",str); for (i=0;i<=7;i++) printf("%c",str[i]); //用*(str+i)也行 printf("\n"); } /* 用字符指针实现字符串操作*/ main() { char *str="Welcome to study C !"; int i; printf("%s\n",str); for(i=0;i<=7;i++) printf("%c",*(str+i)); //用str[i]也行 printf("\n"); } 2.不同点: a)赋值方式不同,字符数组只能对各个元素分别赋值,而字符指针只需赋给字符串的 首地址就可以了。 如: char *str; str="Welcome to study C !"; 以下对字符数组的赋值是错误的: char str[80]; str[ ]="Welcome to study C !"; b)字符指针指向字符串,"hello"是一个字符串常量,与之相关联的内存空间位于内 存的只读部分,如: char ch[] = "china\n"; char *p; char *pp = "CHINA\n"; p = ch; *(p+2) = 'h';//就是可以的 *(pp+2) = 'h';//此处在编译时不会出错,在执行的时候会出错

C语言 数组和指针练习题

若当堂没做完,下周四之前上交也可。 至ftp://211.64.82.253/ 用户名和密码:stu C语言程序设计练习题——数组 一、选择题 77、以下对一维数组a的正确说明是_d ___ A、char a(10); B、int a[ ]; C、int k=5,a[k]; D、char a[ ]={'a' , 'b' , 'c'}; 78、若有说明语句:int a[2][4];,则对a数组元素的正确引用是_a___ A、a[0][3] B、a[0][4] C、a[2][2] D、a[2][2+1] 79、以下能对二维数组y进行初始化的语句是_b__ A、static int y[2][ ]={{1,0,1}, {5,2,3}}; B、static int y[ ][3]={{1,2,3}, {4,5,6}}; C、static int y[2][4]={{1,2,3}, {4,5} , {6}}; D、static int y[ ][3]={{1,0,1,0}, { }, {1,1}}; 80、若有说明语句:int y[ ][4]={0,0};则下面叙述不正确的是_d___ A、数组y的每个元素都可得初值0 B、二维数组y的行数为1 C、该说明等价于int y[ ][4]={0}; D、只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0 81、以下各组选项中,均能正确定义二维实型数组s的选项是_c___ A、float s[3][4]; B、float s(3,4); float s[ ][4]; float s[ ][ ]={{0};{0}}; float s[3][ ]={{1},{0}}; float s[3][4]; C、 float s[3][4]; D、float s[3][4]; static float s[ ][4]={{0},{0}}; float s[3][ ]; auto float s[ ][4]={{0},{0},{0}}; float s[ ][4]; 82、若有说明语句:int a[ ][3]={1,2,3,4,5,6,7,8}; ,则a数组的行数为__a__ A、3 B、2 C、无确定值 D、1 83、若二维数组y有m列,则在y[i][j]前的元素个数为_B___ A、j*m+i B、i*m+j C、i*m+j-1 D、i*m+j+1 84、下面程序中有错误的行是__D__ 1、 main( ) 2、 { 3、 int x[3]={1}; 4、 int k; 5、 scanf("%d", &x); 6、 for (k=1; k<3; k++) 7、 x[0]=x[0]+x[i]; 8、 printf("x[0]=%d\n", x[0]); 9、 } A、3 B、6 C、7 D、5 85、若有以下语句,则正确的描述是__b__ char x[ ]="12345"; char y[ ]={'1', '2', '3', '4', '5'}; A、x数组与y数组的长度相同 B、x数组长度大于y数组长度 C、x数组长度小于y数组长度

指针数组和数组指针的区别

指针数组和数组指针的区别 以前这两问题一直都不是很清晰,写程序也管不了这么多,只要不出错能跑出结果就行,其实很多用C的程序员对C的基础知识都一知半解。 这次要给学生讲指针这一章,特意关注了一下。 而网上一些相关回答也没严格区分,显得十分晦涩。 这里整理如下: 数组指针(也称行指针) 定义int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; for(i=0;i<3;i++) p[i]=a[i]; 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]

实验4(数组、指针、字符串)

实验二C++程序设计基础 一、实验目的 (1)、学习并掌握指针的性质 (2)、掌握指针参数的运用,进一步掌握引用的使用方法 (3)、学习函数指针的应用和带参数的main函数 (4)、学习掌握指针与引用、指针与数组、指针与字符串的用法 二、实验内容及步骤 1、选择题 (1)已知一函数的形参说明为int arr[5][6],在下列说明中,与此等效的形参说明为__________。 A. int arr[][] B. int [5][] C. int *a[6] D. int (* a)[6] (2)已知函数f的原型是:int f(char a,char * b=NULL,double c=0.0); 则下列调用中,不能正确地调用f函数的是__________ 。 A. f(99) B. f(‘A’,4.5) C. f(‘A’,”123”) D. f((char)65,”123”) (3)已知函数f的原型为:void f(int &a,char *b); 变量s,t的定义是:int s; char t[]=”ABCD”;把s和t分别作为第一参数和第二参数来调用函数f,正确的调用语句是:__________ 。 A. f(&s,&t); B. f(&s,t); C. f(s,t); D. f(s,&t); (4)若指针p定义为const char *p="Luchy!"; 则[ ]。 A) p所指向的数据不可改变,p在定义时可以不初始化。 B) p所指向的数据不可改变,p在定义时必须初始化。 C) p本身不可改变,p在定义时可以不初始化。 D) p本身不可改变,p在定义时必须初始化。 (5)已知数组A和指针p定义为:int A[20][10],*p;,要使p指向A的首元素,正确的赋值表达式是[ ]。 A) p=&A 或p=A[0][0] B) p=A 或p=&A[0][0] C) p=&A[0] 或p=A[0][0] D) p=A[0] 或p=&A[0][0] (6)已知函数func的原形是 double func(doouble *pd,int &ri); 变量x和y的定义是 double x; int y; 把x和y分别作为第一参数和第二参数来调用函数func,正确的调用语句是[ ]。 A) func(x,&y); B) func(&x,y); C) func(&x,&y); D) func(x,y); (7)若指针p定义为char * const p="Luchy!"; 则[ ]。 A) p所指向的数据不可改变,p在定义时可以不初始化。 B) p所指向的数据不可改变,p在定义时必须初始化。

指向字符串的指针数组

在初学习C语言时,对于指针是最容易让人迷糊的,尤其对于指针数组,而且是指向字符串的指针数组,恐怕就更难理解了。下面本人给出一个例子,详细讲解指向字符串的指针数组的使用情况。希望给予学习C的朋友一点帮助。 下述程序执行后,输出结果是什么? #include char *p[2][3]={ "abc","defgh","ijkl","mnopqr","stuvw","xyz"}; main(){ printf("%c\n",***(p+1)); printf("%c\n",**p[0]); printf("%c\n",(*(*(p+1)+1))[4]); printf("%c\n",*(p[1][2]+2)); printf("%s\n",**(p+1)); } 答案是: m a w z mnopqr 答案解析: 这里相当于定义了2行3列共6个元素的数组,数组的每一个元素都是指向字符的指针变量。 其中p[0][0]指向串"abc",p[0][1]指向串"defgh",p[0][2] 指向串"ijkl",p[1][0]指向串"mnopqr",p[1][1]指向串"stuvw",p[1][2] 指向串"xyz"。 1、printf("%c\n",***(p+1)); 这里的***(p+1)相当于*(*(*(p+1)+0)+0),而*(*(p+1)+0)+0)的另一种容易懂的形式是p[1][0],在多维数组中这两种写法等价。如上面所写的p[1][0]是指向串"mnopqr",即保存的是串"mnopqr"的首地址,也即字母m的地址。因此***(p+1)是字母m 2、printf("%c\n",**p[0]); 这里的**p[0]等价于*(*(*(p+0)+0)+0),也即*(p[0][0]),而p[0][0])指向串"abc",所以*(p[0][0])是字符a 3、printf("%c\n",(*(*(p+1)+1))[4]); (*(*(p+1)+1))[4]等价于*((p[1][1])+4),而(p[1][1])指向串"stuvw",所以*((p[1][1])+4)是在串首向后移动4个单位的字符,也即w 4、printf("%c\n",*(p[1][2]+2)); 因为p[1][2]指向串"xyz",而p[1][2]+2 就是串首向后移动2个字节(一个字节保存一个字符),也就是指向字符z,所以*(p[1][2]+2)是字符z

指针与数组笔试题

1.请问下面三种变量声明有何区别?请给出具体含义 a)int const *p; b)int* const p; c)int const* const p; 2.在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个 纯粹的ANSI编译器。写代码去完成这一任务。 答:为了访问一绝对地址把一个整型数强制转换(typecast)为一指针; int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa55; 3.下面程序的输出结果是多少? main() { int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d %d" , *(a+1), *(ptr-1) ); } 答:2 5 4.下面程序的输出结果是多少? void foo(int [][3] ); main() { int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}}; foo(a); printf("%d" , a[2][1]); } void foo( int b[][3]) { ++ b; b[1][1] =9; } 答:9 5.下面程序的输出结果是多少? main() { int a[][3] = { 1,2,3 ,4,5,6}; int (*ptr)[3] =a;

printf("%d %d " ,(*ptr)[1], (*ptr)[2] ); ++ptr; printf("%d %d" ,(*ptr)[1], (*ptr)[2] ); } 答:2 3 5 6 6.这3个函数哪一个最可能引起指针方面的问题 int *f1(void) { int x =10; return(&x); } int *f2(void) { int*ptr; *ptr =10; return ptr; } int *f3(void) { int *ptr; ptr=(int*) malloc(sizeof(int)); return ptr; } 答:f1 和f2 7.下面程序的输出结果是多少? main() { char p; char buf[10] ={ 1,2,3,4,5,6,9,8}; p = (buf+1)[5]; printf("%d" , p); } 答:9

C、C++字符串指针(指向字符串的指针)

C、C++字符串指针(指向字符串的指针) C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这里我们来演示一下: #include #include #include int main(){ char str[] = "hello world !"; int len = strlen(str), i; //直接输出字符串 printf("%s\n", str); //每次输出一个字符 for(i=0; i #include #include

int main() { char str[] = "hello world !"; char *pstr = str; int len = strlen(str), i; //使用*(pstr+i) for (i = 0; i

C语言程序设计(第3版)何钦铭 颜 晖 第11章 指针进阶

第11章指针进阶 【练习11-1】如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针数组进行操作? 解答: 指针数组——存放指针的一个数组。 指针数组名也是指向常量二级指针,因为指针数组名总是指向数组的第一个元素。 【练习11-2】用指针数组处理多个字符串有何优势?可以直接输入多个字符串给为初始化的指针数组吗?为什么? 解答: C语言中字符串的地址是按顺序存放的,用指针指向字符串的首地址,然后取出这个地址里面的值,然后指针加一,取出里面的值,这样就能输出整个字符串了。用指针数组可以接收多个字符串,对这些字符串的操作可以做到相互隔离,一个指针数组的元素作为一个指针对应一个字符串。 【练习11-3】参考例11-3,使用二级指针操作改写例11-4中的程序A。 解答: #include #include void fsort(char **ch,int n); int main(void) { int i; char *pcolor[]={"red","blue","yellow","green","black"}; char **ch; ch=pcolor; fsort(ch,5); for(i=0;i<5;i++) printf("%s ",*(ch+i)); return 0; } void fsort(char **ch,int n) { int k,j; char *temp; for(k=1;k0){ temp=*(ch+j); *(ch+j)=*(ch+j+1);

字符串,字符数组,字符指针

字符数组,字符指针,字符串 char a[]="hello world"; char* b="hello world"; string c="hello wolrd"; cout<

实验11.1 指针数组、指针与函数

实验11.1 指针数组、指针与函数 1 调试示例error11_1.cpp 2 编程题 3 编程题 4 计算最长的字符串长度 5 字符串的连接 6 指定位置输出字符串 7 藏尾诗 8 改错题error11_2.cpp 1 调试示例error11_1.cpp /*---程序填空,不要改变与输入输出有关的语句。输入若干有关颜色的英文单词,以#作为输入结束标志,对这些单词升序排列后输出。其中颜色的英文单词数数小于20个,颜色的英文单词长度均不超过10个字符。 输入: Red blue yellow green purple # 输出:blue green purple red yellow ------*/ #include #include #include void main() { int i,j, n = 0,index; char *color[20], str[10], *temp; scanf("%s", str); while(str[0] != '#') { color[n] = (char *)malloc(sizeof(char)*(strlen(str)+1)); strcpy(color[n], str); n++; scanf("%s", str); } for(i=0;i

C语言复习提纲第六章指针2

6.3 字符串与指针 前言 字符串是通过数组来存放的,因此字符串的表现形式可以是:字符数组与字符指针。 一. 字符数组与字符指针的有关概念(P257-P259:10.4.3) 1.定义与初始化 z假设有如下定义: char s1[20]="ASDFGHJ", *s2="ASDFGHJ"; 则:s1是存放字符串的字符数组,s2是指向字符串的指针变量。 (a) 字符数组(b) 字符指针变量 z二者区别: ?字符数组:由若干个元素组成,每个元素存放字符串的一个字符;对字符数组初始化是把字符串放到数组中;s1最多可存储20个字符; ?字符指针:存放的是(char型数据的)地址;对字符指针初始化是把地址(如字符串常量或字符数组的首地址)赋给指针变量;字符串长度不受限定。 2.赋初值 z对字符数组用赋值语句赋值,只能逐个元素进行,不能对整个数组名赋值,因为数组名是地址常量;字符指针变量可以用赋值语句赋地址。 例:char s1[20]; s1[20]= "ASDFGHJ"; × s1="ASDFGHJ"; × char *s2; s2="ASDFGHJ"; √ ?s2中获得的是"ASDFGHJ"字符串常量的首地址。在C/C++中,系统为字符串常量在内存都分配了存储地址(如同字符数组一样处理)。 3.读入字符串(从键盘) z不能对没有指向的字符指针变量从键盘进行输入操作,因为键盘输入的字符串没有存储地址。 例:char *s2; cin>>s2; × z正确方法:将指针指向有效存储空间(如字符数组)后在输入。 例:char s1[20],*s2; s2=s1; cin>>s2; √ cin>>*s2; ×

相关主题
文本预览
相关文档 最新文档