谭浩强c语言程序设计教程学习笔记第8章.docx
- 文档编号:23856313
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:38
- 大小:27.72KB
谭浩强c语言程序设计教程学习笔记第8章.docx
《谭浩强c语言程序设计教程学习笔记第8章.docx》由会员分享,可在线阅读,更多相关《谭浩强c语言程序设计教程学习笔记第8章.docx(38页珍藏版)》请在冰豆网上搜索。
谭浩强c语言程序设计教程学习笔记第8章
第8章指针
8.1地址和指针的概念
按变量地址存取变量值的方式,成为“直接访问”方式。
“间接访问”将变量的地址存放在另一个变量中。
一个变量的地址称为该变量的“指针”。
如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”,指针变量就是地址变量(存放地址的变量)。
指针变量的值(即指针变量中存放的值)是地址(指针)。
8.2变量的地址和指向变量的指针地址
变量的指针就是变量的地址。
存放地址的变量是指针变量,它用来指向另一个变量。
用“*”表示“指向的对象”。
8.2.1怎样定义指针变量?
指针变量的基类型用来指定此指针变量可以指向的变量类型。
定义指针变量一般形式为:
基类型*指针变量名;
说明:
(1)指针变量前的“*”表示该变量的类型为指针类型。
(2)定义指针类型时必须指定基类型。
对指针变量赋值时需要注意:
(1)指针变量中只能存放地址。
(2)赋给指针变量的变量地址不能是任意类型,而只能是与指针变量的基类型具有相同类型的变量的地址。
8.2.2怎样引用指针变量
(1)给指针变量赋值。
p=&a;
(2)引用指针变量的值。
如:
printf(“%o”,p);作用是以八进制输出指针变量p的值,如果p指向了a,就是输出a的地址,即&a。
(3)引用指针变量指向的变量。
(1)“&”算去地址运算符。
(2)“*”指针运算符。
例8.1通过指针变量访问整型变量
#include
intmain()
{
inta,b;
int*pointer_1,*pointer_2;
a=100;
b=200;
pointer_1=&a;
pointer_2=&b;
printf("a=%d,b=%d\n",a,b);
printf("*pointer_1=%d,*pointer_2=%d",*pointer_1,*pointer_2);
return0;
}
例8.2输入a,b连个整数,按先大后小的顺序输出a,b。
#include
intmain()
{
int*p,*p1,*p2;
inta,b;
printf("pleaseentera,b:
\n");
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a
{
p=p1;
p1=p2;
p2=p;
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);
return0;
}
8.2.3指针变量作为函数参数
指针变量作函数参数的作用是将一个变量的地址传到另一个函数中。
例8.3输入a,b连个整数,按先大后小的顺序输出a,b。
用指针变量作函数参数。
#include
intmain()
{
voidswap(int*,int*);
int*p1,*p2;
inta,b;
printf("pleaseentera,b:
\n");
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a
swap(p1,p2);
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);
return0;
}
voidswap(int*p1,int*p2)
{
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
不可能通过执行调用函数来改变实参指针变量的值,但是却可以改变实参指针变量所指变量的值。
例8.4输入3个整数a,b,c,要求按大小顺序将它们输出。
用函数实现改变这3个变量的值。
#include
intmain()
{
voidexchange(int*,int*,int*);
int*p3,*p1,*p2;
inta,b,c;
printf("pleaseentera,b,c:
\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
exchange(p1,p2,p3);
printf("%d,%d,%d\n",a,b,c);
return0;
}
voidexchange(int*q1,int*q2,int*q3)
{
voidswap(int*,int*);
if(*q1<*q2)
swap(q1,q2);
if(*q1<*q3)
swap(q1,q3);
if(*q2,*q3)
swap(q2,q3);
}
voidswap(int*p1,int*p2)
{
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
8.3通过指针引用数组
8.3.1数组元素的指针
所谓数组元素的指针就是数组元素的地址。
8.3.2指针的运算
说明:
(1)P+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
(2)如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d,这样p就指向数组的下一个元素a[1].
(3)如果p的初值是&a[0],则p+i和a+i就是数组元素a[i]的地址。
(4)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i].
(5)如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个数组之差,除以数组元素长度。
8.3.3通过指针引用数组元素
(1)下标法,a[i]。
(2)指针法,*(a+i)。
例8.5有一个整型数组a,有10个元素,输出数组中的全部元素。
(1)下标法
#include
intmain()
{
inta[10];
inti;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
}
(2)通过数组名计算数组元素地址,找出元素的值。
#include
intmain()
{
inta[10];
inti;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%d\t",*(a+i));
printf("\n");
}
(3)用指针变量指向数组元素
#include
intmain()
{
inta[10];
inti,*p;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)
printf("%d\t",*p);
printf("\n");
}
例8.6通过指针变量输出a数组的10个元素。
#include
intmain()
{
int*p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;
for(i=0;i<10;i++,p++)
printf("%d\t",*p);
printf("\n");
}
8.3.4用数组名作函数参数
表以变量名和数组名作为函数参数的比较
实参类型
变量名
数组名
要求形参的类型
变量名
数组名或指针变量
传递的信息
变量的值
实参数组首元素的地址
通过函数调用能否改变实参的值
不能
能改变是参数组元素的值
用变量名作为函数参数传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参是指针变量。
例8.7将数组a中n个整数按相反顺序存放。
#include
intmain()
{
voidinv(intx[],intn);
inta[10]={23,445,6,67,7,67,576,4,3,324},i;
printf("Theoriginalarray:
\n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
inv(a,10);
printf("Thearrayhasbeenreversed:
\n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
return0;
}
voidinv(intx[],intn)
{
inttemp,i,j,m=(n-1)/2;
for(i=0;i { j=n-1-i; temp=x[i]; x[i]=x[j]; x[j]=temp; } } 归纳起来,如果有一个实参数组要想在函数中改变此数组种元素的值,实参与形参的对应关系有以下4种情况: (1)形参和实参都有用数组名; (2)实参用数组名,形参用指针变量; (3)实参形参都引用指针变量; (4)实参为指针变量,形参为数组名; 例8.8用实参指针变量改写例8.7. #include intmain() { voidinv(int*x,intn); int*p,a[10]={23,445,6,67,7,67,576,4,3,324},i; printf("Theoriginalarray: \n"); for(i=0;i<10;i++) printf("%d\t",a[i]); printf("\n"); p=a; inv(p,10); printf("Thearrayhasbeenreversed: \n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谭浩强 语言程序设计 教程 学习 笔记