c语言__第四讲指针练习
c语言指针的习题答案
指针练习题1.有以下程序main(){char a[]="programming",b[]="language";char *p1,*p2;int i;p1=a;p2=b;for(i=0;i<7;i++)if(*(p1+i)==*(p2+i))printf("%c",*(p1+i));}输出结果是A)gm B)rg C)or D)ga2.设有说明int(*ptr)[m];其中的标识符ptr是A)M个指向整型变量的指针B)指向M个整型变量的函数指针C)一个指向具有M个整型元素的一维数组的指针D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量3.若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是A) p+1 B) a+1 C) a++ D) ++p4.若有语句int *point ,a=4;和point =&a;下面均代表地址的一组选项是A. a,point,*&aB. &*a,&a,*pointC. &point,*point,&aD. &a,&*point,point5.下面程序段的运行结果是char a[]=”language”,*p;p=a;while(*p!=’u’) {printf(“%c”, *p-32);p++;}A. LANGUAGEB. LANGuageNGngUAGE6.以下程序的运算结果是*p=1,m=3,n=5 。
#include<stdio.h>void main(){int a[5]={1,2,3,-4,5};int m,n,*p;p=&a[0];m=*(p+2);n=*(p+4);printf("*p=%d,m=%d,n=%d",*p,m,n);}7.写一通用函数slength,求出一个字符串的长度,并用main函数调用slength。
c语言指针详细讲解
c语言指针详细讲解
C 语言中指针是非常强大的概念,它允许程序直接访问内存中的数据。
指针在 C 语言中最初是被用于解决内存分配问题而提出的,随着 C 语言的发展,指针也变得愈发重要。
指针的本质是一个存储变量地址的变量。
在 C 语言中,指针通常用符号&来表示,例如&x 表示的是 x 变量的地址。
指针变量存储的是一个内存地址,当程序读取指针变量时,它会读取该地址中存储的数据。
C 语言中可以使用指针进行高效的内存操作。
例如,当程序需要对一个数组元素进行修改时,可以直接用指针修改该元素的值,而不必修改数组名本身。
另外,指针还可以用于动态分配内存,这是 C 语言中一个重要的特性。
指针的使用方法比较灵活,但也需要小心使用。
如果不小心处理指针,可能会导致未知的错误。
例如,当指针指向的内存空间被释放后,程序试图访问该内存空间时可能会导致未定义的行为。
因此,在C 语言中,指针的使用需要更加谨慎。
C 语言中指针是一个非常重要和强大的概念,掌握指针的使用方法可以让程序员写出更加高效和安全的代码。
全的C语言指针详解PPT课件
在函数中使用指针参数
03
使用指针参数来访问和修改指针所指向的内容,需要使用“-
>”或“*”运算符。
05
指针的高级应用
指向指针的指针(二级指针)
定义与声明
二级指针是用来存储另一个指 针的地址的指针。在声明时, 需要使用`*`操作符来声明二级
指针。
初始化与使用
通过使用`&`操作符获取一个指 针的地址,并将该地址存储在 二级指针中。然后,可以通过 二级指针来访问和操作原始指
当使用malloc或calloc等函 数动态分配内存后,如果 不再需要该内存,必须使 用free函数释放它。否则, 指针将指向一个无效的内 存地址。
当一个指针在函数中定义 ,但该函数返回后仍然存 在并继续指向无效的内存 地址时,就会产生野指针 。
避免指针越界访问
总结词:指针越界访问是指试图访问数 组之外的内存,这是不安全的,可能会 导致程序崩溃或产生不可预测的结果。
指针与内存分配
通过指针来访问和操作动态分配的内存空间。指针可以 存储动态分配的内存地址,并用于读取和写入该地址中 的数据。
指向结构体的指针
01
定义与声明
指向结构体的指针是指向结构体类型的指针。在声明时,需要使用结
构体类型的名称来声明指向结构体的指针。
02 03
初始化与使用
通过使用`&`操作符获取结构体的地址,并将该地址存储在指向结构 体的指针中。然后,可以通过该指针来访问和操作结构体中的成员变 量。
```
பைடு நூலகம்
指向数组元素的指针
• 指向数组元素的指针是指向数组中某个具体元素的指针。通过将指针指向数组中的某个元素,可以访问该 元素的值。
• 指向数组元素的指针可以通过定义一个指向具体元素的指针来实现。例如,定义一个指向数组中第三个元 素的指针,可以使用以下代码
C语言指针章节选择题
有问题的题目:40、46、54、55、122、123、1. 若已定义:int a[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;其中0≤i≤9,则对a数组元素不正确的引用是A) a[p-a] B) *(&a[i])C) p[i] D) a[10]D2. 已知指针p的指向如下图所示,则执行语句*--p;后*p的值是a[0] a[1] a[2] a[3] a[4]┌──┬──┬──┬──┬──┐│10 | 20 | 30 │40 | 50 |└──┴──┴──┴──┴──┘p↑A) 30 B) 20C) 19 D) 29B3. 下面程序运行时,如果从键盘上输入3,5<回车>,程序输出的结果是________。
main( ){ int a,b,*pa,*pb;pa=&a; pb=&b;scanf("%d,%d",pa,pb);*pa=a+b;*pb=a+b;printf("a=%d,b=%d\n",a,b);}A) a=13,b=13 B) a=8,b=8C) a=8,b=13 D) 出错C4. 下面程序段的输出结果是________。
main( ){ char string1[20],string2[20]={"ABCDEF"};strcpy(string1,string2);printf("%s\n",string1+3);}A) EF B) DEFC) CDEF D) ABCDEFB5. 下列程序执行后的输出结果是________。
main(){ int a[3][3],i,*pmul;pmul=&a[0][0];for(i=0;i<9;i++) pmul[i]=i+1;printf("%d\n",a[1][2]);}A) 3 B) 6C) 9 D) 随机数B6. 有如下程序段int *p,a=10,b=1;p=&a; a=*p+b;执行该程序段后,a的值为________。
C语言指针详解
C语言指针详解1 程序如何运行当我们打开电脑中的任何一个程序运行时,我们的操作系统会将该程序存在硬盘的所有数据装载到内存中,然后有CPU 进行读取内存中的数据并进行计算,并将计算的结果返回给我们的操作系统,然后操作系统将相应的动作交付给相应的硬件来完成。
如:将声音数据交给声卡,最后有音响输出来,将图像交给显卡最后有显示器输出……但是还会有一部分数据会返回给内存,以供程序下面的语句继续使用。
我们都知道内存的容量有很大,如:4G,8G, 16G,有时候我们会打开很多的程序,所有的程序的数据都存放到我们的内存中,那么CPU是如何正确的读取我们的不同程序的数据并加以计算的哪?2 内存的假设设计为了让我们的CPU 可以很好的读取内存中的数据,内存必须做优化设计,于是给内存设定了集合设计,将我们的内存分成很多大小相同的方格(盒子),所有的数据将放入这些小盒子中,将不同的程序的数据放入到不同的小盒子中,这样就出现的模块化的内存,当我执行程序的一个命令时,CPU就会从相应的盒子读数据然后计算,由于我们硬件所能访问或计算的最小单位是字节,所以内存中的这样的一个小盒子的大小就给他规定一个字节。
3 地址和指针一般我们声明一块内存空间的时候,会给他取一个名字,为的是我们在编写程序的时候方便使用空间中存放的值,但是CPU 读数据的时候会忽视这个名字,因为CPU无法理解这样的数据,CPU 只能执行0,1代码,那么CPU是如何知道从什么地方读取数据,又到什么地方地址数据的读取的那,所以必须对内存做2次设计,就是将内存中分成的很多小盒子下面标注一些顺序的序号,例如:从第一个盒子开始,标注1,2,3,4,5,6,7,……每一个数字对应一个盒子,但是真正的内存如中不是使用这些十进制数字的,而是使用16进制整数表示的,如0x16ffee。
这些我们标记的数字就叫做内存中的地址。
由于这些地址和盒子是对应的关系,所以只要知道了地址,就可以得到对应盒子中存放的数据了,形象的说,我们说这个地址指向对应的盒子,在C语言中可以通过地址得到对应盒子的数据是*地址。
(完整word版)C语言指针练习+答案+讲解
第七章指针7.1 选择题1.若有说明:int a=2, *p=&a, *q=p;,则以下非法的赋值语句是(D)。
A. p=q; B. *p=*q; C. a=*q; D. q=a;a是整型数,int *p,*q定义了指针,p,q是指向整型的指针.p取得a的地址,而q取得p的地址p,q是指针(也就是一个地址),而*p和*q是这个指针指向的整型数值(存放在这个地址的值).A)把q的地址赋给p,则p和q完全一样了,都指向一个数2B)把q中数据个pC)把q中数据给aD)a中数据是2,不能够给一个地址。
除非*q=a2.若定义:int a=511, *b=&a;,则printf("%d\n”, *b);的输出结果为:D A.无确定值 B. a的地址 C. 512 D. 511int a=511,*b=&a;a 是整形变量b 是整形指针变量,指向 aprintf("%d\n",*b);就是输出指针变量 b,所指变量的值输出结果5113.已有定义int a=2, *p1=&a, *p2=&a; 下面不能正确执行的赋值语句是(B)。
A. a=*p1+*p2; B. p1=a; C. p1=p2; D. a=*p1*(*p2);47、已知在程序中定义了如下的语句:int *P1,*P2;int k;p1=&k;p2=&k;则下列语句中不能正确执行是( B )A、k=*P1+*P2;B、p2=k;C、P1=P2;D、K=*P1 * (*P2);P1 P2是指针,K是整型变量,变量怎么可以赋值给指针呢?A其实是执行了K=K+K(P1和P2都指向K,所以*P1 *P2其实都是指K)C是赋值语句D其实执行了K=K*K4.变量的指针,其含义是指该变量的(B)。
A.值 B.地址 C.名 D.一个标志5.若有说明语句:int a, b, c, *d=&c;,则能正确从键盘读入三个整数分别赋给变量a、b、c的语句是(A)。
(完整word版)C语言指针习题___附答案
一、选择题1。
变量的指针,其含义是指该变量的_________。
a)值 b)地址c)名 d)一个标志2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是_____。
a)a,point,*&a b)&*a,&a,*pointc)*&point,*point,&a d)&a,&*point ,point3.若有说明;int *p,m=5,n;以下正确的程序段的是________。
a)p=&n; b)p=&n;scanf(”%d”,&p); scanf(”%d”,*p);c)scanf("%d",&n); d)p=&n;*p=n; *p=m;4。
以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是________. main(){int *p,*q,a,b;p=&a;printf(“input a:”);scanf(“%d",*p);……}a)*p表示的是指针变量p的地址b)*p表示的是变量a的值,而不是变量a的地址c)*p表示的是指针变量p的值d)*p只能用来说明p是一个指针变量5。
已有变量定义和函数调用语句:int a=25; print_value(&a);下面函数的正确输出结果是________.void print_value(int *x){ printf(“%d\n”,++*x);}a)23 b)24 c)25 d)26B) p=(long *)malloc(8);scanf(”%ld”,p);C) scanf(”%ld",p=&a);D) scanf("%ld",&a);7.有以下程序#include〈stdio。
h>main(){ int m=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;printf("%d,%d,%d,%d\n",m,n,*p,*q);}程序运行后的输出结果是A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,28.有以下程序main(){ int a=1, b=3, c=5;int *p1=&a, *p2=&b, *p=&c;*p =*p1*(*p2);printf("%d\n",c);}执行后的输出结果是A)1 B)2 C)3 D)49。
C语言 数组和指针练习题
若当堂没做完,下周四之前上交也可。
至ftp://211.64.82.253/用户名和密码:stuC语言程序设计练习题——数组一、选择题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的每个元素都可得初值0B、二维数组y的行数为1C、该说明等价于int y[ ][4]={0};D、只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值081、以下各组选项中,均能正确定义二维实型数组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、3B、2C、无确定值D、183、若二维数组y有m列,则在y[i][j]前的元素个数为_B___A、j*m+iB、i*m+jC、i*m+j-1D、i*m+j+184、下面程序中有错误的行是____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、3B、6C、7D、585、若有以下语句,则正确的描述是__b__char x[ ]="12345";char y[ ]={'1', '2', '3', '4', '5'};A、x数组与y数组的长度相同B、x数组长度大于y数组长度C、x数组长度小于y数组长度D、x数组等价于y数组86、以下不正确的数组定义语句是__b__A、double x[5]={2.0, 4.0, 6.0, 8.0, 10.0};B、int y[5]={0, 1, 3, 5, 7, 9};C、char ch1[ ]={'1', '2', '3', '4', '5'};D、char ch2[ ]={'\x10', '\xa', '\x8'};87、以下正确的数组定义语句是_c___A、char a[5]={'1', '2', '3', '4', '5', '\0'};B、int b[2][ ]={{1}, {2}};C、float c[ ][3]={1, 2, 3, 4, 5};D、char d[5]="CHINA";88、判断字符串str1是否大于字符串str2,应当使用__d__A、if (str1>str2)B、if (strcmp(str1, str2))C、if (strcmp(str2, str1)>0)D、if (strcmp(str1, str2)>0)89、下面程序段的运行结果是_c___char x[5]={'a', 'b', '\0', 'c', '\0'};printf("%s", x);A、'a''b'B、abC、ab└┘cD、abc90、有两个字符数组a,b,则以下能正确为a,b进行赋值的语句是_d___A、gets(a, b);B、scanf("%s%s", &a, &b);C、getchar(a); getchar(b);D、gets(a); gets(b);91、有字符数组s1[80]和s2[80],则以下能正确对s1, s2进行输出的语句是___b_A、puts(s1, s2)B、printf("%s, %s", s1, s2);C、putchar(s1, s2);D、puts(s1), puts(s2);92、以下程序段的运行结果是_c___char a[7]="abcdef";char b[4]="ABC";strcpy(a, b);printf("%c", a[5]);A、└┘B、\0C、eD、f93、以下描述正确的是_d___A、两个字符串所包含的字符个数相同时,才能比较字符串B、字符个数多的字符串比字符个数少的字符串大C、字符串"STOP└┘"与"STOP"相等D、字符串"That"小于字符串"The"94、以下对字符数组的描述中错误的是_c___A、字符数组中可以存放字符串B、字符数组中的字符串可以整体输入、输出C、可以在赋值语句中通过赋值运算符"="对字符数组整体赋值D、不可以用关系运算符对字符数组中的字符串进行比较95、若有语句:char s1[10], s2[10]={"books"},则能将字符串books赋给数组s1的正确语句是_b___A、s1={"books"};B、strcpy(s1, s2);C、s1=s2;D、strcpy(s2, s1);96、以下printf语句的输出结果是____printf("%d\n", strlen("school");A、7B、6C、存在语法错误D、不定值97、下面程序的功能是将字符串s中所有的字符c删除。
C语言指针用法详解
C语言指针用法详解C语言指针用法详解指针可以说是集C语言精华之所在,一个C语言达人怎么可以不会指针呢。
下面店铺给大家介绍C语言指针用法,欢迎阅读!C语言指针用法详解(1)关于指针与数组的存储a、指针和数组在内存中的存储形式数组p[N]创建时,对应着内存中一个数组空间的分配,其地址和容量在数组生命周期内一般不可改变。
数组名p本身是一个常量,即分配数组空间的地址值,这个值在编译时会替换成一个常数,在运行时没有任何内存空间来存储这个值,它和数组长度一起存在于代码中(应该是符号表中),在链接时已经制定好了;而指针*p创建时,对应内存中这个指针变量的空间分配,至于这个空间内填什么值即这个指针变量的值是多少,要看它在程序中被如何初始化,这也决定了指针指向哪一块内存地址。
b、指针和数组的赋值与初始化根据上文,一般情况下,数组的地址不能修改,内容可以修改;而指针的内容可以修改,指针指向的内容也可以修改,但这之前要为指针初始化。
如:int p[5];p=p+1; 是不允许的而p[0]=1; 是可以的;//int *p;p=p+1; 是允许的p[0]=1; 是不允许的,因为指针没有初始化;//int i;int *p=&i;p[0]=1; 是允许的;对于字符指针还有比较特殊的情况。
如:char * p="abc";p[0]='d'; 是不允许的为什么初始化了的字符指针不能改变其指向的内容呢?这是因为p 指向的是“常量”字符串,字符串"abc"实际是存储在程序的静态存储区的,因此内容不能改变。
这里常量字符串的地址确定在先,将指针指向其在后。
而char p[]="abc";p[0]='d'; 是允许的这是因为,这个初始化实际上是把常量直接赋值给数组,即写到为数组分配的内存空间。
这里数组内存分配在先,赋值在后。
(2)关于一些表达式的含义char *p, **p, ***p;char p[],p[][],p[][][];char *p[],*p[][],**p[],**p[][],*(*p)[],(**p)[],(**p)[][];能清晰地知道以上表达式的含义吗?(知道的去死!)第一组:char *p, **p, ***p;分别为char指针;char*指针,即指向char*类型数据地址的指针;char**指针,即指向char**类型数据的指针;他们都是占4字节空间的指针。
【C语言指针模拟测试题_答案】
C语言指针部分模拟测试题一、选择题1.语句int a=10,*point=&a; D 其值不为地址。
A. pointB. &aC. &pointD. *point2.若p为指针变量,y为变量,则y = *p++;的含义是 A A.y=*p;p++ B.y=(*p)++ C.y=p;p++ D.p++;y=*p 3.语句char str[]=”visual C++”;char *p=str;则p的值为 BA. ”visual C++”B.str的首地址C. \nD.”v”4.设有说明语句char *s[]={“student”,”Teacher”,”Father”,”Month”}, *ps=s[2];执行语句:printf(“%c,%s,%c”,*s[1],ps,*ps);则输出为AA.T,Father,FB.Teaher,F,FatherC. Teacher,Father,FatherD.语法错,无输出5.下列说明或赋值语句,不正确的是 CA. char *p;p=”Visual C++”;B. char p1[12]={‘v’,’i’,’s’,’u’};C. char p2[12];p2=”Visual C++”D. char p3[]=”Visual”;6.现有int b[3][4],*p;p=(int *)b;若要指针p指向b[2][3],以下正确的是 BA.p+=3*4+3B.p+=2*4+3C. p+=(3*4+3)*sizeof(int)D.p+=(2*4+3)*sizeof(int)7.语句int i,*p1,**p2;以下语句语法不正确的是 BA.p1=&i;B. p2=&i;C.p2=&p1;D.i=’\0x23’;8.如下图结构体说明和变量的定义,p指向a,q指向变量b.下面不能..把结点b连接到结点a之后的语句是 BC. p->next=&b;D.(*p).next=q;9.下面正确的语句是 AA. int a[3][4],(*p)[4]; p=a;B. int a[3][4],*p[4]; p=a;C. int a[3][4],*p; p=a;D. int a[3][4],**p;*p=a;10.以“追加”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的是 BA.fp=fopen("a:\\aa.dat","ab");B. fp=fopen("a:\\aa.dat","a");C. fp=fopen("a:\\aa.dat","r+");D. fp=fopen("a:\\aa.dat","w");11.设有函数定义:int f1(void){return 100,150;}调用函数f1()时, BA.函数返回值100B. 函数返回值150C. 函数返回二个值100和150D. 语句return 100,150;语法错.12.数组作为函数的形参时,把数组名作为实参,传递给函数的是 AA.该数组的首地址B. 该数组的元素个数C. 该数组中的各元素值D. 该数组的大小13.执行以下语句序列:则 Aenum {Sun,Mon,Tue,Wed,Thu,Fri,Sat}c1,c2; //Ac1=Mon; //Bprintf(“%d”,c1);A.输出1B.输出2C.输出0D. B行语法错14.执行以下语句序列:则 Cchar *p1=”Speaking”; //Achar *p2=”English”; //Bchar *p3=”a piece of cake”; //Cchar *str[]={p1,p2,p3}; //Dprintf(“%c”,*(str[0]+1));A.输出EnglishB.输出SpeakingC.输出pD. D行语法错二、填空题1.(2*2分=4分)下面程序的运行结果为16 、 2void main( ){static int a[3][2]={{12},{14,16},{1,2}};int *p=a[1];printf(“%d\n”,*(p+1));printf(“%d\n”,*(p+3));}2.(2*2分=4分)若有以下程序段,则*(*(b+2)+1)的值为11 ,*(*(p+1)+1)的值为7static int b[3][2]={1,3,5,7,9,11};int (*p)[2];p=b;3.(1*4分=4分)下面程序的运行结果为26#include<stdio.h>void sub(int *x,int i,int n){if(n<=i)sub(x,i,3*n);*x+=n++;}void main( ){int x=0;sub(&x,12,2);printf(“%d”,x);}4.(2*2分=4分)以下程序运行结果为_ Hello,world _、ello,world void main(){char *p,*q;char str[]="Hello,World\n";q = p = str;p++;printf(“%s\n”,q);printf(“%s\n”,p);}5. (1*4分=4分)以下程序运行结果是__121232343454_________ void main(){short ar[5]={1,2,3,4,5 };short * par=&ar[1];int i;for(i=0; i<4; i++){printf(“%d %d %d”,ar[i],par[i],*(ar+i));}}6.(2*2分=4分) 以下程序运行结果是__200 100_____void swap2(int *x,int *y){int t;t=*x;*x=*y;*y=t;}void main( ){ int a=100,b=200;swap2(&a,&b);printf(“%d\t%d”,a,b);}7.(3*2分=6分)void fun(int n, int *s){ int f1,f2;if(n= =1||n= =2)*s=1;else{fun(n-1,&f1);fun(n-2,&f2);*s=2*f1+f2+1;printf(“%d\t%d”,f1,f2);}}void main( ){ int x;fun(4,&x);printf(”x=%d\n”,x);}程序输出的第一行是1 1 第二行是4 1 最后一行是x=108. (3*2分=6分)void f(int *q1,int *q2,int *q3){*q3=*q1+*q2;}void main( ){ int i,j,a[3][3]={1,1},*p1=a[0],*p2=a[0]+1,*p3=a[0]+2;for(i=2;i<9;i++)f(p1++,p2++,p3++);for(i=0;i<3;i++){ for(j=0;j<3;j++)printf(“%d”,a[i][i]);printf(’\n’);}}程序输出的第一行是111 第二行是555 最后一行是343434 9.(2*3分=6分)int f(int x,int y){return x*y;}void main( ){ int i,j,(*fun)(int,int);fun=f;for(i=1;i<4;i++){ switch(i){case 1:case 2: j=(*fun)(i,i+1);break;case 3: j=(*fun)(i-1,i+2);break;}printf(”j=%d”,j);}}程序输出的第一行是j=2 第二行是j=6 最后一行是j=10三、完善程序1.(2*3分=6分)以下min 函数的功能是:在非空单向链表中查找结点数据域为最小的值,并作为函数返回值.链表如下.struct NODE{int data;NODE *next;};int min(NODE *first){NODE *p;int m;p=first;m=p->data;for(p=p->next;p!=NULL;p= p->next )if(m> p->data )m=p->data;return m;}2.(3*2分=6分)以下程序求二维数组的平均值float average(float (*p)[4],int n){float sum=0;for(int i=0; i<n ;i++){for(j=0;j<4;j++)sum+= (*p)[j] 或 *(*p+j) ;p++;}return sum/(n*4);}void main( ){ float score[3][4]={{56,65,70,76},{89,97,52,81},{90,99,91,86}};printf(”平均值=%f ”,average(score, 3 ));}3. (2*3.5分=7分)以下程序实现将以L 为头指针的链表逆置(设结点个数n>2),即将链表头当链表尾,链表尾当链表头。
c语言指针的用法
c语言指针的用法c语言是一种高级编程语言,它可以直接操作内存中的数据。
指针是c语言中一种特殊的变量,它可以存储另一个变量的地址,也就是内存中的位置。
通过指针,我们可以间接地访问或修改内存中的数据,从而实现更高效和灵活的编程。
本文将介绍c语言指针的基本概念、定义和初始化、运算和应用,以及一些常见的错误和注意事项。
希望本文能够帮助你掌握c语言指针的用法,提高你的编程水平。
指针的基本概念指针是一种数据类型,它可以存储一个地址值,也就是内存中某个位置的编号。
每个变量在内存中都有一个唯一的地址,我们可以用指针来记录这个地址,然后通过这个地址来访问或修改变量的值。
例如,假设有一个整型变量a,它的值为10,它在内存中的地址为1000(为了简化,我们假设地址是十进制数)。
我们可以定义一个指向整型的指针p,并把a的地址赋给p,如下所示:int a =10; // 定义一个整型变量a,赋值为10int*p; // 定义一个指向整型的指针pp =&a; // 把a的地址赋给p这里,&a表示取a的地址,也就是1000。
p = &a表示把1000赋给p,也就是让p指向a。
从图中可以看出,p和a是两个不同的变量,它们占用不同的内存空间。
p存储了a的地址,也就是1000。
我们可以通过p 来间接地访问或修改a的值。
指针的定义和初始化指针是一种数据类型,它需要在使用前进行定义和初始化。
定义指针时,需要指定它所指向的变量的类型。
初始化指针时,需要给它赋一个有效的地址值。
定义指针的一般格式为:type *pointer_name;其中,type表示指针所指向的变量的类型,如int、char、float等;pointer_name表示指针的名称,如p、q、ptr等;*表示这是一个指针类型。
例如:int*p; // 定义一个指向整型的指针pchar*q; // 定义一个指向字符型的指针qfloat*ptr; // 定义一个指向浮点型的指针ptr注意,在定义多个指针时,每个指针前都要加*号,不能省略。
C语言第四章练习题
C语⾔第四章练习题注意,本套题⽬中有些涉汲到函数的调⽤和指针的使⽤,⼤家⾃已先去看下,不懂就问,培养⾃⼰的⾃学能⼒。
⼀,选择题1.若有以下定义int x[10], *pt=x;则对x数组元素的正确引⽤是A) pt+3B) *&x[10]C) *(pt+10)D) *(x+3)2.有以下程序#includemain(){ int i, s=0, t[]={1,2,3,4,5,6,7,8,9};for(i=0;i<9;i+=2) s+=*(t+i);printf("%d\n",s);}程序执⾏后的输出结果是A) 20B) 25C) 45D) 363.#includemain(){ int c[6]={10,20,30,40,50,60}, *p,*s;p = c; s = &c[5];printf("%d\n", s-p );}程序运⾏后的输出结果是A) 5B) 50C) 6D) 60{ int a[3]={0}, i, j, k=2;for( i=0; ifor( j=0; jprintf("%d\n", a[1] );}程序运⾏后的输出结果是A) 0B) 2C) 15..有以下程序#includemain(){ int a[5]={2,4,6,8,10}, *p,**k;p = a; k = &pprintf("%d ", *( p++ ) );printf("%d\n", **k );}程序运⾏后的输出结果是A) 4 6B) 4 4C) 2 2D) 2 46.以下叙述中正确的是A) ⼀条语句只能定义⼀个数组B) 每个数组包含⼀组具有同⼀类型的变量,这些变量在内存中占有连续的存储单元C) 数组说明符的⼀对⽅括号中只能使⽤整型常量,⽽不能使⽤表达式D) 在引⽤数组元素时,下标表达式可以使⽤浮点数7.以下叙述中正确的是A) 数组下标的下限是1B) 数组下标的下限由数组中第⼀个⾮零元素的位置决定C) 数组下标的下限由数组中第⼀个被赋值元素的位置决定D) char c1, c2, *c3, c4[40];是合法的变量定义语句8.以下叙述中正确的是C) 语句 char a[2] = {"A", "B"}; 是合法的,定义了⼀个包含两个字符的数组D) 语句 char a[3]; a = "AB"; 是合法的,因为数组有三个字符空间的容量,可以保存两个字符9.有以下程序#includemain(){ int a[ ]={ 2,4,6,8,10 }, x, *p, y=1;p = &a[1];for( x=0; x<3; x++ ) y += *(p+x);printf( "%d\n",y );}程序的输出结果是A) 13B) 19C) 1110.有以下程序#includemain(){int a[ ] = { 2,4,6,8 }, *p=a, i;for( i=0; i<4; i++ )a[i]=*p++;printf( "%d\n" ,a[2] );}程序的输出结果是A) 2B) 8C) 4D) 611.以下叙述正确的是A) 不能在数组说明符的⼀对⽅括号中使⽤表达式B) char c1, *c2, **c3, c4[2]; 是C语⾔的合法语句C) 数组下标的最⼩值可以是负值D) 若有数组定义 int array[5]; 则语句printf("%d",array[1.23]);是合法的int b[] = {9};char c[3] = {"A", "B"};char d = "12";以下叙述正确的是A) a, b的定义合法,c, d的定义不合法B) a,b,c,d的定义都是合法的C) a,b,c的定义是合法的,d的定义不合法D) 只有a的定义是合法的12.对于函数声明void fun(float array[], int *ptr);下叙述正确的是A) 调⽤函数时,array数组的元素和ptr都是按值传送B) 函数声明有语法错误,参数 array 缺少数组⼤⼩定义C) 调⽤函数时,array数组中将存储从实参中复制来的元素值D) 函数参数 array, ptr 都是指针变量13.要求定义⼀个具有6个元素的int型⼀维数组,以下选项中错误的是A) int a[2*3] = {0};B) int N = 6, a[N];C) #define N 3int a[N+N];D) int a[] = {1,2,3,4,5,6};14.设有定义:int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a,i;,若0≤i≤9,则对a数组元素的引⽤错误的是A) *(&a[i])B) a[10]C) p[i]D) a[p-a]15.有以下程序#includeint fun(int x[],int n){static int sum=0, i;for(i=0;ireturn sum;{int a[]={1,2,3,4,5}, b[]={6,7,8,9}, s=0; s=fun(a,5)+fun(b,4);printf("%d\n",s);}程序执⾏后的输出结果是A) 55B) 50C) 45D) 60⼆,填空题1. #includevoid fun(int *s, int n1, int n2){int i, j, t;i=n1; j=n2;while( i{t=s[i]; s[i]=s[j]; s[j]=t; i++; j--;}}main(){int a[10]={1,2,3,4,5,6,7,8,9,0}, k; fun(a,0,3); fun(a,4,9); fun(a,0,9); for(k=0;k<10;k++)printf("%d", a[k]);printf("\n");}则输出结果是。
C语言练习之指针
1.设有说明int s[2]={0,1},*p=s;则下列错误的C语句是(A )。
A)s+=1; B)p+=1; C)*p++; D)(*p)++;数组名是常量不能自加!2.int array[10] = {1,2,3,4,5,6,7,8,9,10};int *p = NULL; p = array;p+1; *(p + 1); (p + 10); *(p + 10); p = array + 2; p—; &(p = p+3); 各个语句的值。
3.下面程序的输出: C#include <stdio.h>fun(int x, int y, int *cp, int *dp){*cp=x+y;*dp=x-y;}int main( ){int a,b,c,d;a=30; b=50;fun(a, b, &c, &d);printf("%d,%d\n", c, d);return 0;}A)50,30 B)30,50 C)80,-20 D)80,204.若有定义和语句:int **pp,*p,a=10,b=20;pp=&p; p=&a; p=&b;printf("%d,%d\n",*p,**pp);则输出结果是(D)A)10,20 B)10,10 C)20,10 D)20,205.下面程序的运行结果:char s[80], *sp = "HELLO!"sp = strcpy(s,sp);s[0] = 'h';puts(sp);hELLO!6.程序中输入apple<CR> cat <CR>,输出结果是atmain (){char *s , c[80];s = c;gets(s);while ((*(++s))!='\0'){if (*s == 'a')break;else{s++;gets(s);}}puts(s);}7.mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。
C语言进阶-第四讲 存储器与指针
第四讲存储器与指针(Memory & Pointer)凌明trio@ Ver2.0 2008.3.31东南大学国家专用集成电路系统工程技术研究中心目录存储器,还是存储器!内存陷阱!动态内存分配算法动态内存分配代码讲解2.1 指针的基本概念2.1.1 指针是什么?指针是一个变量,它的值是另外一个变量的地址。
例12.1.2 指针的类型指针所存储的那个变量类型,就称为指针的类型。
例2 有三个不同类型的指针:int I[2], *pI = &I[0]; 右边的三个运算有何不同?pI++;char C[2], *pC = &C[0]; pC++;float F[2], *pF = &F[0];pF++;0x00C7指针变量int *p0x00C7变量int a上面例中的两个0x00C7有什么区别?2.1.3 指针的三个要素1.指针指向的地址(指针的内容);2.指针指向的地址上的内容;3.指针本身的地址。
例3:int A, *pA, **ppA;pA = &A;ppA = &pA;在复杂的指针都可以通过下表来分析:&ppA ppA *ppA **ppA&pApA*pA&A A第二章指针2.1.4 指针的大小(指针变量占用的内存空间)与所用的CPU 寻址空间大小和类型有关,而与指针类型无关。
8位CPU 的指针长度为1~2个字节(51单片机的情况较为复杂,是1~3个字节);16位CPU 的指针长度为2个字节(如MSP430);32位CPU 的指针长度为4个字节(如Intel 80386)。
上面所述是通常情况,并不是全部符合。
2.1.5 指针的初始化变量在没有赋值之前,其值不定的。
对于指针变量,可以表述为:指向不明。
程序访问了一个没有初始化的指针:int* p;p 的内存是随机的一个数,比如:0x3FF0073D程序随即访问内存地址:0x3FF0073D0x3FF0073D 是哪里的内存?说不定正好是Windows 老大要用的内存,你竟敢访问!Windows 一生气,蓝屏。
C语言指针讲解
float a;
int * pointer_1;
pointer_1=&a;
编辑课件
9
在对指针变量赋值时需要注意两点:
⑴ 指针变量中只能存放地址(指针),不要将一个 整数赋给一个指针变量。
例: * pointer_1=100; /* pointer_1是指针 变量,100是整数,不合法 */
(2) 赋给指针变量的变是量地址不能是任意的类型, 而只能是与指针变量的基类型具有相同类型的变 量的
编辑课件
22
可以用一个指针变量指向一个数组元素。
例如:int a[10]; (定义a为包含10个整型数据的数组)
int *p; (定义p为指向整型变量的指针变量)
p=&a[0]; (把a[0]元素的地址赋给指针变量p) 也就是使p指向a数组的第0号元素 。
编辑课件
23
编辑课件
24
10.3.2 指针的运算
编辑课件
29
(3) 用指针变量指向数组元素。
#include <stdio.h> void main() { int a[10];
int *p,i; for(i=0;i<10;i++)
scanf(″%d″,&a[i]); printf(″\n″); for(p=a;p<(a+10);p++)
printf(″%d ″,*p); }
{ void exchange(int *q1, int *q2, int *q3);
int a,b,c,*p1,*p2,*p3;
scanf(″%d,%d,%d″,&a, &b, &c);
p1=&a;p2=&b;p3=&c;
exchange (p1,p2,p3);
c语言面试题__指针篇
c语言面试题__指针篇1. char * const p;char const * pconst char *p上述三个有什么区别?char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *p------------------------------------------------------2. char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << ( str1 == str2 ) << endl;cout << ( str3 == str4 ) << endl;cout << ( str5 == str6 ) << endl;cout << ( str7 == str8 ) << endl;打印结果是什么?解答:结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域-----------------------------------------------3. 以下代码中的两个sizeof用法有问题吗?void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母{for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i ) if( 'a'<=str[i] && str[i]<='z' )str[i] -= ('a'-'A' );}char str[] = "aBcDe";cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;UpperCase( str );cout << str << endl;答:函数内的sizeof有问题。
C语言字符串处理函数---练习(指针数组-字符串处理函数)
C语言字符串处理函数练习请查询并学习相关的字符串处理函数:求长度:strlen,msdn格式如下,其它雷同size_t strlen(const char*string);其中size_t为int的类型重新定义复制:strcpy比较:strcmp,返回值为0,表示相等连接:strcatN复制:strncpy定位字符:strchr字符串转换为数字串:atoi,atof,atoll其它函数:sprintf【数据输入】数据是一个很长的字符串,用#分割,如下所示:中国#郑州#410037#welcome注意:#符号隔开的字符串长度不一定相同【功能要求】(1)用指针数组实现分割后结果的存储指针数组:类型*符号名[]注意区分:指向数组的指针:(类型*)符号名[]例1:静态的指针数组char*aa[]=//4个元素,每个为char*类型{"hello","中华人民共和国","郑州市","世纪欢乐园"}为一个数组,数组的每个元素为指针类型,args每个元素为字符串。
例2:动态分配指针数组//定义一个二维指针char**mm=NULL;int nLen=3;//指针数组个数mm=new char*[nLen];//申请3个数组元素,每个的类型为char*//-------为每一个数组元素申请空间,并填充内容char bb[256]="";strcpy(bb,"hello");mm[0]=new char[strlen(bb)+1];//第0个数组元素strcpy(mm[0],bb);//strcpy(bb,"中华人民共和国");mm[1]=new char[strlen(bb)+1];strcpy(mm[1],bb);//strcpy(bb,"河南省郑州市");mm[2]=new char[strlen(bb)+1];strcpy(mm[2],bb);//printf("%s\n%s\n%s\n",mm[0],mm[1],mm[2]);(2)分割后的个数(3)分割结果的输出【解题思路】先求出分割后的个数,然后分配指针数组,并存储,最后输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("\n");
return 0;
}
void inv(int x[ ],int n)
{ int temp,*i,*j;
i=x;
j=x+n-1;
for( ;i<j;i++,j--)
for(i=0;i<=m;i++)
{ j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;
}
}
----改进
#include <stdio.h>
int main()
{ void inv(int x[ ],int n);
int i, a[10]={3,7,9,11,0,6,7,5,4,2};
return 0;
}
void swap(int *p1,int *p2)
{ int *p2=temp;
}
--------------------------------------------------------------------------------
例2 输入a和b两个整数,按先大后小的顺序输出a和b。
#include <stdio.h>
int main()
{ int *p1,*p2,*p,a,b;
printf("integer numbers:");
scanf("%d,%d",&a,&b);
p1=&a; p2=&b;
{ printf("%d",*p); p++; }
printf("\n");
return 0;
}
void sort(int x[],int n)
{ int i,j,k,t;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(k!=i)
{t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;}
for(i=0;i<10;i++) scanf("%d",p++);
p=a;
for(i=0;i<10;i++,p++)
printf("%d ",*p);
printf("\n");
return 0;
}
--------------------------------------------
例1 通过指针变量访问整型变量
#include <stdio.h>
int main()
{ int a=100,b=10;
int *pointer_1, *pointer_2;
pointer_1=&a;
pointer_2=&b;
printf("a=%d,b=%d\n",a,b);
例8.8 将数组a中n个整数按相反顺序存放
#include <stdio.h>
int main()
{ void inv(int x[ ],int n);
int i, a[10]={3,7,9,11,0,6,7,5,4,2};
for(i=0;i<10;i++) printf("%d",a[i]);
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if (a<b) swap(pointer_1,pointer_2);
printf("max=%d,min=%d\n",a,b);
}
--------------------------------------------------------------
例8.6 有一个整型数组a,有10个元素,要求输出数组中的全部元素。
(1) 下标法
#include <stdio.h>
int main()
{ int a[10]; int i;
{ int temp,*i,*j;
i=x; j=x+n-1;
for( ; i<j; i++,j--)
{ temp=*i; *i=*j; *j=temp; }
}
----------指针变量作实参
#include <stdio.h>
#include <stdio.h>
printf("enter 10 integer numbers:\n");
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)
printf("%d",*p);
printf("\n");
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
void swap(int *pt1, int *pt2)
{ int temp;
temp=*pt1; *pt1=*pt2; *pt2=temp;
if(a<b)
{ p=p1; p1=p2; p2=p; }
printf("a=%d,b=%d\n",a,b);
printf("%d,%d\n",*p1,*p2);
return 0;
}
-----------------------------------------------------------------------------
p1=&a;p2=&b;p3=&c;
exchange(p1,p2,p3);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
void exchange(int *q1, int *q2, int *q3)
{ void swap(int *pt1, int *pt2);
for(i=0;i<5;i++)
printf("%d ",*(a+i));
printf("\n");
return 0;
}
(3) 用指针变量指向数组元素
#include <stdio.h>
int main()
{ int a[10]; int *p,i;
return 0;
}
------------------------------------------
例8.7 通过指针变量输出整型数组a的10个元素。
#include <stdio.h>
int main()
{ int *p,i,a[10];
p=a;
printf("enter 10 integer numbers:\n");
}
(2) 通过数组名计算数组元素地址,找出元素的值
#include <stdio.h>
int main()
{ int a[5]; int i;
printf("enter 5 integer numbers:\n");
for(i=0;i<5;i++) scanf("%d",&a[i]);
printf("\n");
inv(a,10);
for(i=0;i<10;i++) printf("%d",a[i]);
printf("\n");
return 0;
}
void inv(int x[ ],int n)
{ int temp,i,j,m=(n-1)/2;
for(i=0;i<10;i++) printf("%d",a[i]);
printf("\n");
inv(a,10);
for(i=0;i<10;i++) printf("%d",a[i]);
printf("\n");
return 0;
}
void inv(int x[ ],int n)
例8.5 输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现
#include <stdio.h>
int main()
{ void exchange(int *q1, int *q2, int *q3);