C - Lab8-1 - 指针基本概念

更新时间:2024-04-13 06:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程:C语言程序设计 学号: 姓名: 班级:

实验8-1 指针基本概念

【知识点回顾】

1. 指针变量

1) 声明指针变量,如int x, * p;中,p为指针变量。

2) 初始化指针变量,如p=&x;令int指针变量p指向int变量x。 3) 通过指针变量访问数据,如scanf(“%d”,p); 2. 指针运算符

1) 间接访问运算符“*” 2) 取地址运算符“&”

【典型例题】

1. 例题1,指针的基本使用方法

#include

int main() {

int data=100;

int * pd; //声明指针变量 pd=&data; //初始化指针变量

printf(\变量的直接访问 printf(\变量的间接访问

printf(\变量的地址输出 printf(\指针变量的输出

return 0; }

【Q&A】

1. Q:指针变量为什么要进行初始化?

A:一般,变量的使用都需要经过声明、初始化后才能够使用,指针变量也不例外。如果变量空间未经初始化,那么存放的内容是个随机值,而指针变量的含义,即为它存放的地址是随机值。如果此地址恰好是系统正在使用的内存地址,那么该操作就将改写系统正在使用的某个数据,可能导致系统被破坏,由此可见,未经初始化就使用的指针十分危险,为了避免发生意外,最好给不能确定初值的指针变量赋以空值NULL,通常也把未经初始化就使用的

1

课程:C语言程序设计 学号: 姓名: 班级:

指针称为野指针。

2. Q:指针变量的地址就是指针存放的地址吗?

A:不是。如int x=5; int * p=&x;中,指针变量p是一个变量,系统要为它分配存储空间(通常为4个字节),该存储空间的起始地址即为指针变量的地址,即&p。而指针变量存放的地址,即,p中存放的变量x的地址信息,&x。

3. Q:指向不同数据类型的指针占用的内存空间大小都相同吗?

A:是的。无论指针指向哪种数据类型,所有指针所占内存空间大小都相同,只随机器硬件不同而不同。在32位机器上,所有指针变量都占用4个字节的空间。

4. Q:声明指针变量时“*”是运算符吗?

A:声明指针变量时,指针变量名前的“*”只表明当前被声明的变量不是普通变量,而是一个指针变量,不具有运算的含义。在运算表达式中,指针变量名前的“*”才是一个运算符。

5. Q:编译器如何判别“*”是乘号、间接访问运算符、还是用来声明指针?

A:编译器根据上下文来判别“*”的用途。如果它所在的语句以数据类型开头,则它用于声明一个指针变量;如果被用于一个已经声明过的指针变量名之前,则被判定为间接访问运算符;如果用于运算表达式中,且右边不是指针变量名,则被认为是一个乘法运算符。

【实验内容】

1. 设计程序,满足以下要求功能:

1) 声明两个单精度型变量x和y;x初始化为2.618; 2) 声明单精度型指针变量ptr_x,并指向x; 3) 输出ptr_x指向的变量的值;

4) 将ptr_x指向的变量的值加2后赋给变量y; 5) 输出变量y的值;

6) 用%p方式输出x和y的地址;

7) 用%p方式输出ptr_x,看看输出的值是否是x的地址。

#include

int main() {

float x=2.618,y; float *ptr_x=&x;

printf(\y=*ptr_x+2; printf(\

printf(\

2

课程:C语言程序设计 学号: 姓名: 班级:

printf(\}

2. 下列函数假设用来计算数组a中的元素和以及平均值,且数组a长度为n。avg和sum

指向函数需要修改的变量。函数含有几个错误,请找出这些错误并且改正。

void avg_sum(float a[], int n, float *avg, float *sum) { int i; sum=0.0;

for(i=0; i

avg = sum/n;

return 0; }

#include

void avg_sum(float a[], int n, float *avg, float *sum); int main() {

float a[]={1,3,5,7,9},avg,sum; avg_sum(a,5,&avg,&sum);

printf(\}

void avg_sum(float a[], int n, float *avg, float *sum) { int i; *sum=0.0; for(i=0; i

*avg = *sum/n; }

*sum += a[i];

sum += a[i];

3. 编写函数void swap(int *p , int *q);当传递两个变量的地址时,swap函数应该交换两者的值。提示:调用函数时可以使用swap(&x,&y);的形式。

#include void swap(int *p , int *q); int main()

3

课程:C语言程序设计 学号: 姓名: 班级:

{

int x,y;

scanf(\ printf(\ swap(&x,&y);

printf(\ }

void swap(int *p , int *q) { }

4. 编写函数void findLargest(int a[], int n, int *largest);当传递长度为n的数组a时,

函数将找到数组的最大值元素,并用largest指针变量指向它。提示:调用该函数进行测试时,可使用findLargest(a,10,&max);类似的形式。

#include

void findLargest(int a[], int n, int *largest); int main() {

int a[]={5,8,7,24,10,6,78,2,1,45},max=a[0];

findLargest(a,10,&max); printf(\

4

int temp; temp=*p; *p=*q; *q=temp;

课程:C语言程序设计 学号: 姓名: 班级:

}

void findLargest(int a[], int n, int *largest) { }

int i;

for(i=1;i<10;i++) if(a[i]>*largest ) *largest=a[i];

【课后练习】

1. 选择题:

1) 变量的指针,其含义是指该变量的 B 。

A. 值 B. 地址 C. 名 D. 一个标志

2) 若需要建立如图所示的存储结构,且已有声明float *p, m=3.14;则正确的赋值语

句是 B 。

A. p=m; B. p=&m; C. *p=m; D. *p=&m; 3) 有如下语句

int a=10, b=20, *p1, *p2; p1= &a; p2=&b;

如图1所示;若要实现图2所示的存储结构,可选用的赋值语句是 B 。

A. *p1=*p2 B. p1=p2; C. p1=*p2; D. *p1=p2;

4) 若有语句int *point, a=4; 和point=&a; 下面均代表地址的一组选项是

D 。 A. a, point, *&a B. &*a, &a, *point C. *&point, *point, &a D. &a, &*point, point

5) 若有以下声明和语句,则能表示a数组元素地址的表达式是 A 。

5

课程:C语言程序设计 学号: 姓名: 班级:

double a[5], *p1; p1=a;

A. a+0 B. p1+5 C. *p1 D. &a[5]

6) 若有以下声明int a[5], *p=a; 且0<=i<5, 则对a数组元素的非法引用是

D 。 A. a[i] B. *(a+i) C. *(p+i) D. *(&a+i) 7) 若有以下定义,则数值不为3的表达式是 C 。

int x[10]={0,1,2,3,4,5,6,7,8,9}, *p1;

A. x[3] B. p1=x+3, *p1++; C. p1=x+2, *(p1++); D. p1= x+2, *++p1;

8) 若有声明:int * p, m=5, n; 以下正确的程序段是 D 。

A. p=&n; scanf(“%d”, &p); B. p=&n; scanf(“%d”, *p); C. scanf(“%d”, &n); *p=n; D. p=&n; *p=m;

9) 若有声明:int * p1, *p2, m=5, n;以下均是正确赋值语句的选项是 C 。 A. p1=&m; p2=&p1;

B. p1=&m; p2=&n; *p1=*p2; C. p1=&m; p2=p1; D. p1=&m; *p2=*p1;

10) 有四对对指针变量进行操作的语句,以下判断正确的选项是 D 。 (1)int *p, *q; q=p;

int a, *p, *q; p=q=&a; (2)int a, *p,*q; q=&a; p=*q; int a=20, *p; *p=a;

(3)int a=0,b=0, *p; p=&a; b=*p; int a=20,*p,*q=&a; *p=*q; (4)int a=20, *p, *q=&a; a=q; int p, *q; q=&p; A. 正确:(1); 不正确:(2)(3)(4)。 B. 正确:(1)(4); 不正确:(2)(3)。 C. 正确:(3); 不正确:(1)(2)(4)。 D. 以上结论都不正确。

11) 如下代码调用scanf语句有错,其错误原因是 B 。

main() { int *p, *q, a,b; p=&a; printf(“input a: ”); scanf(“%d”, *p); ??

}

A. *p表示的是指针变量p的地址。

B. *p表示的是变量a的值,而不是变量a的地址。 C. *p表示的是指针变量p的值。

6

课程:C语言程序设计 学号: 姓名: 班级:

D. *p只能用来声明p是一个指针变量。

12) 以下选项中,对指针变量p的正确操作是 B 。 A. int a[5], *p; p=&a; B. int a[5], *p; p=a;

C. int a[5]; int *p=a=1000;

D. int a[5]; int *p1, *p2=a; *p1=*p2;

2. 下面程序的运行结果是 a=11 p=11 。

a=0

3. 下面程序的运行结果是 b=6 。

4. 下面程序的运行结果是 k=0 k=1 k=3 k=6 。

5. 下面程序的运行结果是 n1=1 n2=6 。

7

课程:C语言程序设计 学号: 姓名: 班级:

8

本文来源:https://www.bwwdw.com/article/ezsp.html

Top