C语言程序设计知识点—第8章 指针结构体与预处理命令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
13. 指向数组的指针
一个数组存储在一块连续内存单元中;数组名就是这块连续内存单元的首地址; 第 (i + 1) 个数组元素的地址可表示为 &data[i] 或 (data+i)。 可以通过以下方式为指向数组的指针赋值:
int a[10]; pa=&a[0]; // 或者 pa=a; 一个指针变量可以指向一个数组元素
主讲教师:杨剑
{ int a[3] = { 77, 88, 99 }; int i;
for (i = 0; i < 3; ++i) printf(“%d\n”, *(a + i));
return 0; } 答案: 77 88 99 本书习题八第 2 题阅读程序,写出结果 #include <stdio.h> int main() { int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int *p, *q;
point(char *p) {
p+=3; } main() {
char b[4]={„a‟,‟b‟,‟c‟,‟d‟},*p=b; point(p); printf(“%c\n”,*p); } 程序运行后的输出结果是() A.a B.b C.c D.d 答案:A
16. 函数返回指针
大多数情况,函数返回的都是一个简单类型的值 而有时,函数会产生一个数据对象(如数组、指针等),并且希望将这个对象返回给
p = a; q = &a[6]; printf(“%d\n”, (q – p) / sizeof(a[0])); return 0; } 答案:1 【本书习题八第 3 题】下面程序的意图是通过指针来输入和输出数组。请根据程序 的上下文在横线处填上缺失的语句或语句的缺失部分。 #include <stdio.h> int main() { int a[10]; int i = 0; int *p;
~ 11 ~
C 语言程序设计知识点
主讲教师:杨剑
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
printf(“%d”, a);
printf(“%d”,*p);
//假设 a 的内存地址为 2000H.
8. 指针的特点
~3~
C 语言程序设计知识点
主讲教师:杨剑
指针变量的命名规则和其他变量的命名规则一样 指针不能与现有变量同名 指针可存放 C 语言中的任何基本数据类型、数组和其他所有高级数据结构的地址 若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址 应为指针指定一个地址后,才能在语句中使用指针
11. 指针算术运算
指针自增 p++/++p 或自减 p--/--p 意义指向下一个或前一个数据。 等价于 p+1 或 p-1
~5~
C 语言程序设计知识点
主讲教师:杨剑
[注意] 前置或后置的区别 [例] int a[]={1,2,3},*p=a; printf(“%d”,*p++); //输出 1 printf(“%d”,*++p); //输出 2 为什么??
~6~
C 语言程序设计知识点
主讲教师:杨剑
int *ptr,data[10]; ptr=data+3;//或者 ptr=&data[3] 指向数组的指针示例 #include <stdio.h> void main() { int data[] = {5, 10, 15, 20, 25}; int i = 0; int *ptr; ptr = data; while(i < 5) { printf(“\n 第 %d 个元素的存储地址为:%x, 值为: %d\n“,i+1, ptr, *ptr); i++; ptr++; } }
18. 定义结构
结构定义并不预留内存 结构定义放置在程序的开始部分,位于头文件声明之后 结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。
19. 声明结构变量
声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于 其所有成员变量的大小之和。
p=
①
for (i = 0; i < 10;
;
②
)
scanf(“%d”, p++);
③
for (
④
printf(“%5d”,
⑤
) );
return 0;
}
答案:
~8~
C 语言程序设计知识点
主讲教师:杨剑
①a 或&a[0] ②i++ ③p=&a[0]或 p=a ④for (i = 0; i < 10;i++) ⑤a[i]或*p++或*(p+i)或*(a+i)或 p[i]
flag = 0;break; }
} if(flag) printf("\n 该字符串是回文串\n"); else
printf("\n 该字符串不是回文串\n"); } 本书习题八第 2 题阅读程序,写出结果 #include <stdio.h> int main()
~7~
C 语言程序设计知识点
14. 指向字符串的指针
在 C 语言中,可以将字符指针指向字符串 被指向的字符串可以是一个常量字符串,也可以是一个存储着字符串的字符数组
15. 指针变量作为函数参数
函数的参数不仅可以是整数、实型、字符型等数据,还可以是指针类型,它的作用 是将一个变量的地址传递到另一个函数中。
示例:交换两个变量的值 [练习]有以下程序:
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
10. 指针赋值运算
~4~
Байду номын сангаас
C 语言程序设计知识点
主讲教师:杨剑
[练习]若有说明语句:double *p,a;则能通过 scanf 语句正确给输入项读入数据的程序 段是( )
A.*p=&a;scanf(“%lf”,p); B.*p=&a;scanf(“%f”,p);
C.p=&a;scanf(“%lf”,*p);
()
A.*p=*q; B.p=q; C.*p=&n1; D.p=*q; 答案:A [练习]设已有定义:float x;,则以下对指针变量 p 进行定义且赋初值的语句中正确的是
()
A.float *p=1024; B.int *p=(float x);
C.float p=&x; 答案:D
D.float *p=&x;
将指针加上或者减去某个整数值
12. 指针关系运算
指向同一种数据类型的两个指针才能进行关系运算。值为 1 或 0 p > q p < q p == q
不能与非指针类型变量进行比较,但可与 NULL(即 0 值)进行等或不等的关系运算 如: 判断 p 是否为空指针 P == NULL p != NULL
D.p=&a;scanf(“%lf”,p);
答案:D [练习]若有定义:int x=0,*p=&x;则语句 printf(“%d\n”,*p);的输出结果是()
A.随机值 B.0 答案:B
C.x 的地址
D.p 的地址
[练习]设有定义:int n1=0,n2,*p=&n2,*q=&n1;以下赋值语句中与 n2=n1;语句等价的是
I.先定义结构,再声明结构变量 struct student { int num; char name[20]; char sex; float score; }; struct student student1,student2;
II.在定义结构类型的同时声明结构变量
~ 10 ~
C 语言程序设计知识点
struct student {
int num; char name[20]; char sex; float score; }student1,student2; III. 直接声明结构变量 struct { int num; char name[20]; char sex; float score; }student1,student2;
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。
20. 结构变量初始化
主讲教师:杨剑
21. 结构变量赋值
用输入语句或赋值语句来给结构变量的各个成员赋值
22. 示例
根据学员的成绩,输出不及格学员的详细信息。 #include<stdio.h> struct student { int num;//学号 char *name;//姓名 char sex;//性别
~1~
C 语言程序设计知识点
主讲教师:杨剑
5. 指针相关的运算符
6. 指针变量的赋值
~2~
C 语言程序设计知识点
主讲教师:杨剑
7. 指针变量的引用
“*”:定义时,表示声明一个指针变量;
使用时,表示指针所指向的变量的内容
[格式] *变量名 //获取指向变量的值
[例] int a=10,*p, b; p = &a; [思考] printf(“%d”, p);
9. 指针使用示例 1
#include <stdio.h> void main() { int var = 10; int *ptr_var; ptr_var = &var; printf(" var 的值是: %d", var); printf("\n var 的内存地址是: %x", &var); printf("\n 指针 ptr_var 的地址是: %x\n", &ptr_var); printf("\n var 的值是: %d", *ptr_var); printf("\n var 的地址是: %x\n", ptr_var); }
调用者 这时,我们就可以让函数返回一个指向这个数据对象的指针,而不是整个对象返回给
~9~
C 语言程序设计知识点
主讲教师:杨剑
调用者,那样会引起内存数据的复制。 格式:类型 *函数名(形参列表) 例子:char * strchr(char ch, char *s);
17. 结构体简介
“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些 数据项称为结构的成员。
指向数组的指针示例
void main() {
char name[5] = {'M', 'A', 'D', 'A', 'M'}; int flag = 1; char *start=name, *end=name+4; for(;start <= end; start++, end--){ if(*start != *end) {
3. 指针简介
指针也是一个变量,只不过该变量中存储的是另一个对象的内存地址 如果一个变量存储另一个对象的地址,则称该变量指向这个对象 由于指针值是数据,指针变量可以赋值,所以一个指针的指向在程序执行中可以改
变。指针 p 在执行中某时刻指向变量 x,在另一时刻也可以指向变量 y
4. 声明并初始化指针变量
一个数组存储在一块连续内存单元中;数组名就是这块连续内存单元的首地址; 第 (i + 1) 个数组元素的地址可表示为 &data[i] 或 (data+i)。 可以通过以下方式为指向数组的指针赋值:
int a[10]; pa=&a[0]; // 或者 pa=a; 一个指针变量可以指向一个数组元素
主讲教师:杨剑
{ int a[3] = { 77, 88, 99 }; int i;
for (i = 0; i < 3; ++i) printf(“%d\n”, *(a + i));
return 0; } 答案: 77 88 99 本书习题八第 2 题阅读程序,写出结果 #include <stdio.h> int main() { int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int *p, *q;
point(char *p) {
p+=3; } main() {
char b[4]={„a‟,‟b‟,‟c‟,‟d‟},*p=b; point(p); printf(“%c\n”,*p); } 程序运行后的输出结果是() A.a B.b C.c D.d 答案:A
16. 函数返回指针
大多数情况,函数返回的都是一个简单类型的值 而有时,函数会产生一个数据对象(如数组、指针等),并且希望将这个对象返回给
p = a; q = &a[6]; printf(“%d\n”, (q – p) / sizeof(a[0])); return 0; } 答案:1 【本书习题八第 3 题】下面程序的意图是通过指针来输入和输出数组。请根据程序 的上下文在横线处填上缺失的语句或语句的缺失部分。 #include <stdio.h> int main() { int a[10]; int i = 0; int *p;
~ 11 ~
C 语言程序设计知识点
主讲教师:杨剑
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
printf(“%d”, a);
printf(“%d”,*p);
//假设 a 的内存地址为 2000H.
8. 指针的特点
~3~
C 语言程序设计知识点
主讲教师:杨剑
指针变量的命名规则和其他变量的命名规则一样 指针不能与现有变量同名 指针可存放 C 语言中的任何基本数据类型、数组和其他所有高级数据结构的地址 若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址 应为指针指定一个地址后,才能在语句中使用指针
11. 指针算术运算
指针自增 p++/++p 或自减 p--/--p 意义指向下一个或前一个数据。 等价于 p+1 或 p-1
~5~
C 语言程序设计知识点
主讲教师:杨剑
[注意] 前置或后置的区别 [例] int a[]={1,2,3},*p=a; printf(“%d”,*p++); //输出 1 printf(“%d”,*++p); //输出 2 为什么??
~6~
C 语言程序设计知识点
主讲教师:杨剑
int *ptr,data[10]; ptr=data+3;//或者 ptr=&data[3] 指向数组的指针示例 #include <stdio.h> void main() { int data[] = {5, 10, 15, 20, 25}; int i = 0; int *ptr; ptr = data; while(i < 5) { printf(“\n 第 %d 个元素的存储地址为:%x, 值为: %d\n“,i+1, ptr, *ptr); i++; ptr++; } }
18. 定义结构
结构定义并不预留内存 结构定义放置在程序的开始部分,位于头文件声明之后 结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。
19. 声明结构变量
声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于 其所有成员变量的大小之和。
p=
①
for (i = 0; i < 10;
;
②
)
scanf(“%d”, p++);
③
for (
④
printf(“%5d”,
⑤
) );
return 0;
}
答案:
~8~
C 语言程序设计知识点
主讲教师:杨剑
①a 或&a[0] ②i++ ③p=&a[0]或 p=a ④for (i = 0; i < 10;i++) ⑤a[i]或*p++或*(p+i)或*(a+i)或 p[i]
flag = 0;break; }
} if(flag) printf("\n 该字符串是回文串\n"); else
printf("\n 该字符串不是回文串\n"); } 本书习题八第 2 题阅读程序,写出结果 #include <stdio.h> int main()
~7~
C 语言程序设计知识点
14. 指向字符串的指针
在 C 语言中,可以将字符指针指向字符串 被指向的字符串可以是一个常量字符串,也可以是一个存储着字符串的字符数组
15. 指针变量作为函数参数
函数的参数不仅可以是整数、实型、字符型等数据,还可以是指针类型,它的作用 是将一个变量的地址传递到另一个函数中。
示例:交换两个变量的值 [练习]有以下程序:
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
10. 指针赋值运算
~4~
Байду номын сангаас
C 语言程序设计知识点
主讲教师:杨剑
[练习]若有说明语句:double *p,a;则能通过 scanf 语句正确给输入项读入数据的程序 段是( )
A.*p=&a;scanf(“%lf”,p); B.*p=&a;scanf(“%f”,p);
C.p=&a;scanf(“%lf”,*p);
()
A.*p=*q; B.p=q; C.*p=&n1; D.p=*q; 答案:A [练习]设已有定义:float x;,则以下对指针变量 p 进行定义且赋初值的语句中正确的是
()
A.float *p=1024; B.int *p=(float x);
C.float p=&x; 答案:D
D.float *p=&x;
将指针加上或者减去某个整数值
12. 指针关系运算
指向同一种数据类型的两个指针才能进行关系运算。值为 1 或 0 p > q p < q p == q
不能与非指针类型变量进行比较,但可与 NULL(即 0 值)进行等或不等的关系运算 如: 判断 p 是否为空指针 P == NULL p != NULL
D.p=&a;scanf(“%lf”,p);
答案:D [练习]若有定义:int x=0,*p=&x;则语句 printf(“%d\n”,*p);的输出结果是()
A.随机值 B.0 答案:B
C.x 的地址
D.p 的地址
[练习]设有定义:int n1=0,n2,*p=&n2,*q=&n1;以下赋值语句中与 n2=n1;语句等价的是
I.先定义结构,再声明结构变量 struct student { int num; char name[20]; char sex; float score; }; struct student student1,student2;
II.在定义结构类型的同时声明结构变量
~ 10 ~
C 语言程序设计知识点
struct student {
int num; char name[20]; char sex; float score; }student1,student2; III. 直接声明结构变量 struct { int num; char name[20]; char sex; float score; }student1,student2;
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。
20. 结构变量初始化
主讲教师:杨剑
21. 结构变量赋值
用输入语句或赋值语句来给结构变量的各个成员赋值
22. 示例
根据学员的成绩,输出不及格学员的详细信息。 #include<stdio.h> struct student { int num;//学号 char *name;//姓名 char sex;//性别
~1~
C 语言程序设计知识点
主讲教师:杨剑
5. 指针相关的运算符
6. 指针变量的赋值
~2~
C 语言程序设计知识点
主讲教师:杨剑
7. 指针变量的引用
“*”:定义时,表示声明一个指针变量;
使用时,表示指针所指向的变量的内容
[格式] *变量名 //获取指向变量的值
[例] int a=10,*p, b; p = &a; [思考] printf(“%d”, p);
9. 指针使用示例 1
#include <stdio.h> void main() { int var = 10; int *ptr_var; ptr_var = &var; printf(" var 的值是: %d", var); printf("\n var 的内存地址是: %x", &var); printf("\n 指针 ptr_var 的地址是: %x\n", &ptr_var); printf("\n var 的值是: %d", *ptr_var); printf("\n var 的地址是: %x\n", ptr_var); }
调用者 这时,我们就可以让函数返回一个指向这个数据对象的指针,而不是整个对象返回给
~9~
C 语言程序设计知识点
主讲教师:杨剑
调用者,那样会引起内存数据的复制。 格式:类型 *函数名(形参列表) 例子:char * strchr(char ch, char *s);
17. 结构体简介
“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些 数据项称为结构的成员。
指向数组的指针示例
void main() {
char name[5] = {'M', 'A', 'D', 'A', 'M'}; int flag = 1; char *start=name, *end=name+4; for(;start <= end; start++, end--){ if(*start != *end) {
3. 指针简介
指针也是一个变量,只不过该变量中存储的是另一个对象的内存地址 如果一个变量存储另一个对象的地址,则称该变量指向这个对象 由于指针值是数据,指针变量可以赋值,所以一个指针的指向在程序执行中可以改
变。指针 p 在执行中某时刻指向变量 x,在另一时刻也可以指向变量 y
4. 声明并初始化指针变量