C语言程序设计 第九章 指针

合集下载

c语言指针的定义

c语言指针的定义

c语言指针的定义C语言中,指针是一个非常重要的概念。

所谓指针,就是指向内存中某个变量的地址的变量。

定义一个指针变量时,需要使用“*”符号表示这是一个指针变量。

例如:int*p;这个定义表示变量p是一个整型指针变量。

指针变量可以指向任何类型的数据,包括基本数据类型、数组、结构体等。

指针的使用需要注意以下几点:1.操作指针变量时,需要使用“&”符号获取变量的地址,例如:int a=10;int*p=&a;这个例子中,p指向了变量a的地址。

2.操作指针变量时,需要使用“*”符号获取指针指向的值,例如:int a=10;int*p=&a;printf("%d",*p);这个例子中,使用“*p”获取了指针p所指向的变量a的值,并将其打印出来。

3.指针变量可以通过赋值操作改变所指向的变量,例如:int a=10;int b=20;int*p=&a;*p=b;这个例子中,通过将指针p指向变量b的地址,将变量a的值改变为了20。

4.指针变量可以作为函数参数传递,通过指针可以在函数内部修改变量的值,例如:void add(int*a,int b){*a+=b;}int main(){int a=10;add(&a,5);printf("%d",a);return0;}这个例子中,通过指针变量将变量a的地址传递给函数add,在函数内部修改了变量a的值。

总之,指针是一个非常重要的概念,在C语言中广泛应用于各类程序中。

熟练掌握指针的使用方法,是每个C语言程序员的必备技能。

c语言指针详细讲解

c语言指针详细讲解

c语言指针详细讲解
C 语言中指针是非常强大的概念,它允许程序直接访问内存中的数据。

指针在 C 语言中最初是被用于解决内存分配问题而提出的,随着 C 语言的发展,指针也变得愈发重要。

指针的本质是一个存储变量地址的变量。

在 C 语言中,指针通常用符号&来表示,例如&x 表示的是 x 变量的地址。

指针变量存储的是一个内存地址,当程序读取指针变量时,它会读取该地址中存储的数据。

C 语言中可以使用指针进行高效的内存操作。

例如,当程序需要对一个数组元素进行修改时,可以直接用指针修改该元素的值,而不必修改数组名本身。

另外,指针还可以用于动态分配内存,这是 C 语言中一个重要的特性。

指针的使用方法比较灵活,但也需要小心使用。

如果不小心处理指针,可能会导致未知的错误。

例如,当指针指向的内存空间被释放后,程序试图访问该内存空间时可能会导致未定义的行为。

因此,在C 语言中,指针的使用需要更加谨慎。

C 语言中指针是一个非常重要和强大的概念,掌握指针的使用方法可以让程序员写出更加高效和安全的代码。

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

计算机二级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)152、有以下程序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)83、有以下程序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)604、设有定义语句 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 106、有以下程序段int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;b=p[5];b中的值是A)5 B)6 C)8 D)97、已有定义:int i,a[10],*p;则合法的赋值语句是A)p=100; B)p=a[5]; C)p=a[2]+2; D)p=a+2;8、以下能正确定义一维数组的选项是A)int num []; B)#define N 100int num [N];C)int num[0..100]; D)int N=100;int num[N];9、有以下程序main(){ int p[7]={11,13,14,15,16,17,18},i=0,k=0;while(i< 7&&p[i]%2){k=k+p[i];i++;}printf("%d\n",k);}执行后输出结果是A)58 B)56 C)45 D)2410、有以下程序main(){ int x[8]={8,7,6,5,0,0},*s;s=x+3;printf("%d\n",s[2]);}执行后输出结果是A)随机值 B)0 C)5 D)611、若有定义:int aa[8];。

919149-C语言程序设计教程——面向计算思维和问题求解-第9章-新

919149-C语言程序设计教程——面向计算思维和问题求解-第9章-新

9.2.2 嵌套结构体的定义
结构体成员的类型也可以是结构体,这时形成了 结构体的嵌套。
例如,若将引例中学生的年龄“age”改为出生 日期“birthday”,则由于birthday本身含有“年、 月、日”信息,应该为结构体型date的变量,故结 构体stu的定义如下:
9.2.2 嵌套结构体的定义
语言程序设计教程
面向计算思维和问题求解
第9章 复杂结构数据处理
结构体 结构体变量 结构体数组 结构体指针 结构体与函数 结构体与链表 枚举
9.1.1 问题描述
学生信息中包括学号、姓名、性别、年龄(或者 出生日期)和成绩。其中学号和年龄为整型数据、姓 名为字符串、性别为字符型数据、成绩则是浮点型数 据。各数据项的类型不尽相同,它们的组合才能描述 一个学生的信息。若要管理一批学生的相关信息,要 求实现以下操作应如何实现?
#include <stdio.h> struct stu
{
int num;
char name[20];
char sex;
int age;
/*用年龄描述学生的信息*/
float score;
};
例9-3 源代码(续1)
void main( ) {
struct stu student[5]={ {101,"Li ping",'M', 18,45}, {102,"Zhang ping",'M',18,62.5}, {103,"He fang",'F',18,92.5}, {104,"Cheng ling",'F',18,87}, {105,"Wang ming",'M',18,58} };

c语言中的指针详解

c语言中的指针详解

c语言中的指针详解在C语言中,指针是一种特殊的变量类型,它存储了一个变量的内存地址。

通过指针,我们可以间接访问和修改内存中的数据,这对于一些需要动态分配内存的操作非常有用。

以下是关于C语言指针的一些详细解释:1. 定义指针:使用"*"符号来定义指针变量。

例如,int* ptr; 定义了一个指向整型变量的指针 ptr。

2. 取址操作符(&):取地址操作符(&)用于获取变量的内存地址。

例如,&a 返回变量 a 的地址。

3. 解引用操作符(*):解引用操作符(*)用于访问指针所指向的变量的值。

例如,*ptr 返回指针 ptr 所指向的整型变量的值。

4. 动态内存分配:可以使用相关的库函数(如malloc和calloc)在运行时动态分配内存。

分配的内存可以通过指针来访问和使用,并且在使用完后应该使用free函数将其释放。

5. 空指针:空指针是一个特殊的指针值,表示指针不指向任何有效的内存地址。

可以将指针初始化为NULL来表示空指针。

6. 指针和数组:指针和数组在C语言中有密切的关系。

可以通过指针来访问数组元素,并且可以使用指针进行指针算术运算来遍历数组。

7. 传递指针给函数:可以将指针作为函数参数传递,以便在函数内部修改实际参数的值。

这种传递方式可以避免拷贝大量的数据,提高程序的效率。

8. 指针和字符串:字符串在C语言中实际上是以字符数组的形式表示的。

可以使用指针来访问和操作字符串。

需要注意的是,指针在使用时需要小心,因为不正确的操作可能导致程序崩溃或产生不可预料的结果。

对于初学者来说,理解指针的概念和使用方法可能需要一些时间和练习。

C语言第9章结构体、共用体、枚举

C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类

浙大版《c语言程序设计(第4版)》讲解

浙大版《c语言程序设计(第4版)》讲解

浙大版《c语言程序设计(第4版)》讲解《C语言程序设计》是国内C语言教材的重要书籍,高校中的计算机专业等都有教授。

浙大版《C语言程序设计(第4版)》是由著名计算机科学家袁春风编写的C语言教材,该书主要介绍了C语言基础、字符串、数组、指针、结构体、文件操作等内容。

本文将对该书内容做简要概括。

第一部分:C语言基础第一章:概述该章主要介绍了计算机语言的发展与演化,C语言的历史和主要特点,以及C语言的应用领域和发展前景。

第二章:初识C语言该章节主要介绍了C语言的基本概念,例如标识符、关键字、注释等。

并且结合一些简单的例子介绍了C语言的语法格式和执行规则。

第三章:数据类型该章节主要介绍了C语言的数据类型,包括整型、实型、字符型、布尔型等。

并且介绍了类型转换及其规则。

第四章:运算符与表达式该章节主要介绍了C语言的基本运算符及其优先级、结合性和作用。

并且通过实例来介绍了使用运算符和表达式的方法及注意事项。

第五章:分支结构该章节主要介绍了C语言中的分支结构,包括if、if-else、switch等,以及运用分支结构解决问题的方法和技巧。

第二部分:数组、字符串和指针第七章:数组该章节主要介绍了C语言中的数组,包括一维数组、二维数组等,并结合例子介绍了数组的定义、初始化、遍历、赋值等操作。

第八章:字符串该章节主要介绍了C语言中的字符串,包括字符串的定义、初始化、输入、输出等。

并且介绍了使用字符串解决问题的方法和技巧。

第九章:指针第三部分:函数与结构体该章节主要介绍了C语言中的结构体,包括结构体的定义、初始化、访问、结构体数组、结构体指针等。

并且介绍了结构体在程序中的应用。

第四部分:文件操作与其他第十二章:文件操作第十三章:其他语言特性与扩展该章节主要介绍了C语言扩展的特性,包括宏定义、预处理指令、变长参数等。

并且介绍了C语言与其他语言的异同点。

总结:《C语言程序设计(第4版)》是一本权威的C语言教材,该书系统全面地介绍了C语言的基本概念、语法格式、运算符、控制语句、数组、指针、函数、结构体、文件操作等方面的内容,让读者对C语言的掌握更加深入。

第9章 指针

第9章 指针

第九章指针指针是C语言的一个重要概念,也是C的一个重要特色。

正因为有了指针,C语言才可以灵活有效的表示复杂的数据结构,更方便地处理诸如内存、字符串、数组、函数等。

可以说,不掌握指针就不能掌握C的精华。

一、地址和指针的概念地址的概述1、存储器地址计算机所处理的数据,总是要存储在一定的存储介质上,例如内存。

而这些数据的存储,又是有一定先后顺序的。

因此我们通常将这些存储介质上的一个个用于存放数据的基本单元进行线性编址,即按照一定的顺序给每个存储单元(字节)一个编号,这个编号就是该单元的地址。

一般情况下,地址总是从0开始的一系列整数。

某个地址就代表某个存储单元,就如一个房间号Array码对应于一个实际的房间一样。

2、存储单元的内容这是不同于地址的另一概念,它是指某地址单元内具体存放的数据,如一个字符、一个整数、实数或一个字符串。

例:如右图100,101,102,…,205,206等即是地址;160单元的内容就是字符C,161单元的内容就是字符H,…,等。

3、变量的访问一般情况下,程序中的一个变量就对应存储器的若干个单元,对变量的访问可以简单地认为是通过变量名来对内存单元进行存取操作。

实际上,程序在编译之后,变量名已经转化为了与该变量对应的存储单元地址,因而对变量的访问就是通过地址对存储单元的访问。

1)直接访问按照变量地址来对变量进行存取的方式,称为直接访问方式。

例如:右表中对变量a的读取:printf(“%d”,a),其实是先找到a的地址160,然后从160开始读取一个字节的字符‘C’;同理用scanf(“%d”,&b)输入b的值时,在执行时,直接把从键盘输入的数据‘H’送入从地址为161开始的字节单元中。

2)间接访问通过另一变量间接获取某变量的地址,从而间接实现对原变量的访问的方式,称为间接访问方式。

例如:将变量a的地址160存放在另一个变量当中,见上表p=160,那么,对变量a的访问也可以为:先通过变量p的地址205找到该单元的数据160,再将160视为地址,该地址单元内容就是变量a的值(字符‘C’)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、选择题1、指针是一种____A、标识符B、变量C、内存地址D、运算符2、显示指针变量P中的值,可以使用命令_____A、Printf(“%d”,p);B、Printf(“%d”,*p);C、Printf(“%d”,*p);D、Printf(“%d”,p);3、为指针变量P输入整型变量i的地址,可以使用命令____A、Scanf(“%p”,&p);B、 *p=i;C、 P=&I;D、 *p=&I;4、若有定义void *p;int *q;float *r,下面操作不对的是____A、 p=q;B、 q=r;C、 p=r;D、 r=p;5、若有说明#define m 20 int n=10;下面定义不正确的是______A、 Float s[m];B、 Float s[m*10];C、 Float s[m+n];D、 Float s[m+10];6、若有定义int a[]={1,2,0};请问a[a[a[0]]]=______A、 0B、1C、2D、37、若有char s[10],*p=s;则下面表达式正确的是_____A、 s=p+s;B、 p=s+10;C、 s[2]=p[4];D、 p=s[0];8、定义整型指针变量p和q,下面操作不正确的是_______A、 Int *p,q=null;B、 Int *p,q=null,null;C、 Int *p,*q=null,null;D、 Int *p,*q=null;9、若有定义int a[]={1,2,3},b[3]={1,2,3};,请问a==b_______A、不能比较B、结果为真C、结果为假D、结果不确定10、以下程序有错,错误的原因是( )。

main(){int *p,i;char *q,ch;p=&i;q=&ch;*p=40;*p=*q;...}A)p和q的类型不一致,不能执行*p=*q;语句B)*p中存放的是地址值,因此不能执行*p=40;语句C)q没有指向具体的存储单元,所以*q没有实际意义D)q虽然指向了具体的存储单元,但该单元中没有确定的值,所以不能执行*p=*q;语句11、已有定义 int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是( )。

A)k=*ptr1+*ptr2; B)ptr2=k; C)p1=*p2; D)*p1=p2;12、变量的指针,其含义是指该变量的( )。

13、若已定义int a=5;下面对(1),(2)两个语句的正确解释是( )。

(1)int *p=&a; (2) *p=a;A)语句(1)和(2)中的 *p含义相同,都表示给指针变量p赋值B)(1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量pC)(1)在对p进行说明的同时进行初始化,使p指向a(2)将变量a的值赋给指针变量pD)(1)在对p进行说明的同时进行初始化,使p指向a(2)将变量a的值赋于*p14、若有语句int *point,a=4;和point=&a; 下面均代表地址的一组选项是()。

A)a,point,*&a B)&*a,&a,*point C)*&point,*point,&a D)&a,&*point,point15、以下程序输出的结果是()void main(){ int a=5,*p1,**p2;p1=&a,p2=&p1;(*p1)++;printf(“%d\n”,**p2);}A) 5 B) 4 C) 6 D) 不确定16、若有说明: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=m17、若有说明:int *p1,*p2,m=5,n;以下均是正确赋值语句的选项是( )。

A)p1=&m;p2=&p1; B)p1=&m;p2=&n;*p1=*p2; C)p1=&m;p2=p1 D)p1=&m;*p2=*p1;18、已有变量定义和函数调用语句:int a=25; print_value(&a);下面函数的正确输出结果是( )。

void print_value(int *t){ print(“%d\n”,++*x);}A)23 B)24 C)25 D)2619、下面判断正确的是( )。

A)char * a=”china”;等价于 char *a;*a=”china”;B)char str[10]={“china”};等价于char str[10];str[]={“china”};C)char *s=”china”; 等价于 char *s; s=”china”;D)char c[4]=”abc”,d[4]=”abc”; 等价于 char c[4]=d[4]=”abc”;20、设 char *s=”\ta\017bc”; 则指针变量s指向的字符串所占的字节数是( )。

A)9 B)5 C)6 D)721、下面程序段中,for循环的执行次数是( )。

char *s=”\ta\018bc”;for ( ;*s! =’\0’;s++) printf(“*”);A)9 B)5 C)6 D)722、下面能正确进行字符串赋值操作的是( )。

[5]={‘A’,’B’,’C’,’D’,’E’};C) char *s; s=”ABCDE”; D) char *s; scanf(“%s”,s);23、下面程序段的运行结果是( )。

char *s=”abcde”;s+=2; printf(“%d”,s);A)cde B)字符’c’ C)字符’c’的地址 D)无确定的输出结果24、设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是( )。

A)c=*p1+p2; B)p2=c C)p1=p2 D)c=*p1*(*p2);25、有下面的程序段:chat s[]=”china”; char *p; p=s;则下列叙述正确的是( )。

A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等C)s数组长度和p所指向的字符串长度相等 D)*p与s[0]相等26、下面程序的运行结果是( )。

#include<stdio.h>#include<string.h>main(){char *p1,*p2,str[50]=”abc”;p1=”abc”; p2=”abc”;strcpy(str+1,strcat(p1,p2));printf(“%s\n”,str);}A) abcabcabc B)bcabcabc C) aabcabc D)cabcabc27、下面程序的运行结果是( )。

#include<stdio.h>main(){char str[]=”cdalb”;abc(str);puts(str);}abc(char *p){int i,j;for(i=j=0;*(p+i)!=’\0’;i++)if(*(p+i)>=’d’) {*(p+j)=*(p+i); j++;}*(p+j)=’\0’;}A)dalb B)cd C)dl D)c28、下面程序运行结果是( )。

#include<ctype.h>fun(char*p){int i,j; char ts[81];if(! isspace(*p+i)&&(*(p+i)!=’a’))ts[t]=’\0’;strcpy(p,ts);}main(){char str[81]={“a b c d ef g”};fun(str);puts(str);}A) abcdeg B)bcde C)ABCDE D)BCDE29、若有以下定义,则对a数组元素的正确引用是( )。

int a[5],*p=a;A) *&a[5] B) a+2 C) *(p+5) D)*(a+2)30、若有以下定义,则对a数组元素地址的正确引用是( )。

int a[5],*p=a;A) p=5 B)*a+1 C)&a+1 D)&a[0]31、若有定义:int a[2][3];则对数组a的第i行第j列(假设i,j已正确说明并赋值)元数值的正确引用为( )。

A)*(*(i+j)+j) B)(a+i)[j] C)*(a+i+j) D)*(a+i)+j32、若有定义:int a[2][3];则对数组a的第i行第j列(假设i,j已正确说明并赋值)元数地址的正确引用为( )。

A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j33、若有以下定义和语句,则对a数组元素地址的正确引用是( )。

int a[2][3],(*p)[3];p=a;A)*(p+2) B)p[2] C)p[1]+1 D)(p+1)+234、若有以下定义和语句,则对a数组元素地址的正确引用是( )。

int a[2][3],(*p)[3];p=a;A)(p+1)[0] B)*(*(p+2)+1) C)*(p[1]+1) D)p[1]+235、若有定义:int a[5];则a数组中首元素的地址可以表示为( )。

A)&a B)a+1 C)a D)&a[1]36、若有定义:int (*p)[4];则标识符p( )。

A)是一个指向整型变量的指针 B)是一个指针数组名C)是一个指针,它指向一个含有四个整型元素的一维数组 D)定义不合法37、若有以下定义和赋值语句,则对s数组的第i行第j列(假设i,j已正确说明并赋值)元素地址的合法引用为( )。

ints[2][3]={0},(*p)[3];p=s;A)*(*(p+i)+j) B)*(p[i]+j) C)(p+i)+j D)(*(p+i))[j]38、若有以下定义和赋值语句,则对b数组的第i行第j列(假设i,j已正确说明并赋int b[2][3]={0},(*p)[3];p=b;A)*(*(p+i)+j) B)*(p[i]+j)C)(p+i)+j D)(*(p+i))[j] 39、以下与int *q[5];等价的定义语句是( )。

A)int q[5] B)int*q C)int*(q[5]); D)int(*q)[5] 40、设有以下程序段:char str[4][10]={“first”,“second”,“third”,“fourth”},*strp[4]; int n;for(n=0;n〈4;n++) strp[n]=str[n];若k为int型变量且0〈=k〈4,则对字符串的不正确引用是( )。

相关文档
最新文档