内容正文:
第8章 指针
本章内容
8.1指针与指针变量
8.2 指针与数组
8.3 指针与字符串
8.4指针与函数
8.5命令行参数
8.6指向指针的指针变量
8.7综合案例
8.1指针与指针变量
指针的概念
“指针”是指地址,是常量
“指针变量”是指取值为地址的变量
指针变量的值不仅可以是变量的地址 ,也可以是其它数据结构的地址,例如数组、结构体、函数等
指针变量的定义与初始化
指针变量的定义
定义的一般形式为:
类型说明符 *变量名;
例如,int *p; long *p2; float *p3;char *p4;
指针运算符与地址运算符
取地址运算符&
取内容运算符*
main()
{
int a=5,*p=&a;
printf ("%d",*p);
}
main()
{
int a;
int *p=&a;
scanf(“%d”,p);
printf(“*p=%d,a=%d”,*p,*&a);
}
指针变量的初始化
指针变量定义后,需要为其设置指向的地址,在C语言中可以在定义指针变量时直接为其设置地址,即指针变量的初始化。
例如:
int a=10,b=20;
int *pa=&a; /*定义指针型变量pa指向整型变量a的地址*/
int *pb=&b; /*定义指针型变量pb指向整型变量b的地址*/
8.1.3指针运算
赋值运算
指针变量初始化赋值
把一个变量的地址赋予指向相同数据类型的指针变量
把一个指针变量的值赋予指向相同类型的另一个指针变量
把数组的首地址赋予指向数组的指针变量
把字符串的首地址赋予指向字符类型的指针变量
给指针变量赋空值
例如:
int a=10,*pa=&a,*pb;
pb=pa;
例如:
int a[7],*pa;
pa=a; /*数组名表示数组的首地址,故可赋予指向数组的指针变量pa*/
也可写为:
pa=&a[0]; /*数组第一个元素的地址也是整个数组的首地址,也可赋予pa*/
当然也可采取初始化赋值的方法:
int a[7],*pa=a;
例如:
char *pc;
pc="c language";
或用初始化赋值的方法写为:
char *pc="C Language";
例如:
#include “stdio.h”
main()
{
int *p;
p=NULL;
……
}
程序举例
【例8.1】利用指针的方法,将两个数按由小到大的顺序输出。
#include "stdio.h"
main()
{
int a,b;
int *pa=&a;
int *pb=&b;
printf("
Please input a,b:");
scanf("%d,%d",pa,pb);
if(*pa>*pb)
{
pa=&b;
pb=&a;
}
printf("
%d,%d",*pa,*pb);
printf("
a=%d,b=%d
",a,b);
}
加减算术运算
指针加减运算是指指针变量向前或向后移动若干个位置
不同类型指针,移动的字节数不同
关系运算
指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系
注意:
只有相同类型的指针才能进行比较
指针进行关系运算之前,指针必须指向确定的变量或数组
8.2 指针与数组
8.2.1一维数组的指针表示法
例如:
int a[5]={1,2,3,4,5};
int *p;图8.5 指向一维数组的指针
p=a;
图8.5 指向一维数组的指针
8.2.1一维数组的指针表示法
对一维数组的指针有如下规定
p+n与a+n表示数组元素a[n]的地址,即&a[n]
数组元素的表示方法有:a[n]、*(p+n)和*(a+n),三者是等价的
指向数组的指针变量也可用数组的下标形式表示为p[n],其效果相当于*(p+ n)
程序举例
【例8.2】采用指针变量表示的地址法输入输出数组各元素。
#include<stdio.h>
main( )
{
int i,a[10];
int *p=a; / *定义时对指针变量初始化* /
printf(“
Please input 10 numbers:”);
for(i = 0; i<=9; i++)
scanf("%d", p+i);
printf("output:
");
for(i=0; i<=9; i++)
printf("%4d", *(p+i));
printf("
");
}
程序举例
【例8.3】采用数组名表示的地址法输入输出数组各元素。
main( )
{