- 某变量所占用的内存空间的起始地址称为该变量的地址,C语言称其为指针,存储这一地址的变量称为指针变量。
- 通过指针变量可以实现对其它变量的访问
- 指针变量可以指向任何一种数据类型
- 可指向基本类型的变量,也可指向数组
变量直接访问:通过变量名直接使用变量数据。
int a=10,b=20,c;
c=a+b;
printf("%d\n",c);
变量间接访问:通过指针变量访问其他变量数据。
指针变量程序实例
#include<stdio.h>
void main(void){
int a=2008;
int *p;//p为指针变量,*表示取值
p=&a;
printf("%d\n",*p);
}
#include<stdio.h>
void main(void){
int a=2008;
int *p;
p=&a;
printf("%d\n",*p);
}
01指针变量定义
一般格式:数据类型 *指针变量名1,*指针变量2,......
示例
int *p1,*p2;
float *q;
指针变量可以和其他变量同时定义:
char m,n,*p,*q;
注意:“数据类型”是指针变量要指向的变量的数据。基类型
大小p1+1=p1+sizeof(类型);
02指针变量初始化
格式:数据类型*指针变量名1=地址1,*指针变量名2=地址2,...;
示例
int m;
int *p=&m;
指针变量赋值
格式:指针变量=变量地址;
示例
int m=196,*p,*q;
p=&m,
q=p;
当指针变量有了确切的指向目标后,即可用该指针变量指向的目标输入数据
示例:
int score,*p;
p=&score;
scanf("%d",p);
scanf语句的功能与下列语句等价
scanf("%d",&score);
03指针变量的使用
定义指针变量p1、p2,并任意输入两个整数a、b,使得p1指向其中的较大值,p2指向其中的较小者。
#include<stdio.h>
int main(){
int *p1,*p2,*p,a,b;
printf("Input:");
scanf("%d%d",&a,&b);
p1=&a;
p2=&b;
if(a<b)
p=p1,p1=p2,p2=p;
printf("Output:");
printf("%d,%d\n",*p1,*p2);
}
04指针VS一维数组
要解决的问题:用指针实现一维数组的数据处理
主要内容
- 如何将指针和一维数组关联起来,即怎样使指针指向一维数组。
- 如何使用指针访问一维数组的元素
05用指针访问一维数组
对于长度是N的一维数组a,当使用指针p指向其首元素后,即可通过指针p访问数组的各个元素。
简单类型数组a
a[0]用*p表示
a[1]用*(P+1)表示
a[i]用*(p+i)表示
定义和使用指向一维数组的指针变量
int a[N],*p;//N为符号常量
形式:
p=a;
p=&a[0];
使用p访问a数组的元素
printf("%d,%d",*p,*(p+1));
p+1 下一个地址
输出a[0],a[1]
#include<stdio.h>
#define N 10
int main(){
int a[N];
int *p=a,i;
for(i=0;i<N;i++)
scanf("%d",p+i);//&a[i]
for(i=0;i<N;i++)
printf("%d",*(p+i));//a[i]
}
#include<stdio.h>
#define N 10
int main(){
int a[N];
int *p=a,i;
for(i=0;i<N;i++)
scanf("%d",p++);
p=a;
for(i=0;i<N;i++)
printf("%d",*p++);
}
#include<stdio.h>
#define N 10
int main(){
int a[N];
int *p=a,i;
for(i=0;i<N;i++)
scanf("%d",p++);
p=a;
for(i=0;i<N;i++)
printf("%d",*p++);//printf("%d",*p);
p+=1;
}
#include<stdio.h>
#define N 10
int main(void){
int a[N],*p;
for(p=a;p<(a+N);p++)
scanf("%d",p);
for(p=a;p<(a+N);p++)
printf("%d",*p);
return 0;
}
第二种方法
#include<stdio.h>
#define N 10
int main(void){
int a[N],i,max,*p;
p=a;
printf("Data:");
for(i=0;i<N;i++)
scanf("%d",p+i);
max=*p;
for(i=1;i<N;i++)
if(max<*(p+i))
max=*(p+i);
printf("Max:%d\n",max);
}
06指针与二维数组
主要内容
- 如何将指针和二维数组关联起来,即怎样使指针指向二维数组
- 如何使指针访问二维数组的元素
问题一:
int a[3][4];
10 | 20 | 30 | 40 |
80 | 70 | 60 | 50 |
18 | 27 | 36 | 45 |
问:
- 如何使p指向首元素?
- a[i][j]的指针如何表示?
p | 10 | a[0][0] |
p+1 | 20 | a[0][1] |
p+2 | 30 | a[0][2] |
p+3 | 40 | a[0][3] |
p+4 | 80 | a[1][0] |
p+5 | 70 | a[1][1] |
p+6 | 60 | a[1][2] |
p+7 | 50 | a[1][3] |
p+8 | 18 | a[2][0] |
p+9 | 27 | a[2][1] |
p+10 | 36 | a[2][2] |
p+11 | 45 | a[2][3] |
p+i*4+j
指针和二维数组元素的对应关系
设p是指针变量,若有:
p=a[0];等同于p=&a[0][0];
则p+j将指向a[0]数组中的元素a[0][j]
由于a[0]、a[1]、...a[M-1]等各行数组一次连续存储,则对于a数组中的任意元素a[i][j]
地址表示:
p+i*N+j
p的基类型是1个int,a的基类形是4个int。
值表示:
- *(p+i*N+j)
- p[i*N+j]
int a[3][4]={{10,20,30,40},{50,60,70,80},{90,91,92,93}};
int *p=a[0];
则数组a的元素a[1][2]对应的地址指针是:
p+1*4+2=p+6
元素a[1][2]也就可以表示为:*(p+1*4+2)
或者是p[6]
对应的数值是70
例子:指针与二维数组
用指针访问二维数组,求二维数组
#include<stdio.h>
int main(void){
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int *p,max;
for(p=a[0],max=*p;p<a[0]+12;p++)
if(*p>max)
max=*p;
printf("Max=%d\n",max);
}
运行结果:
字符型指针变量指向字符串的方法
定义指针变量、初始化时指向字符串
char *p="a string";
无名字符型一维数组
只有内容没有名字
空格,\0各占一个字符
使指针变量指向字符型数组 从而使其指向字符串
char name[20],*str;
gets(name);
str=name;
#include<stdio.h>
#define N 100
int main(void){
char str[N],*p;
int count;
p=str;
gets(p);
for(count=0;*p!='\0';p++)
if(*p>='0'&&*p<='9')
count++;
printf("Total:%d\n",count);
}
07指针数组
数组元素为指针类型的数组称为指针数组
指针数组中的每一个元素均为指针变量
以为指针数组的定义行驶如下:
数据类型 *数组名[数组长度];
例:char *days[7];
指针数组的每个元素是指针变量,只能存放地址,所以对指向字符串的指针数组赋初值时,要把存放字符串的首地址付给指针数组的对应元素。
例:char *days[7]={"Sunday","Monday","Tudesday","Wednesday","Thursday","Friday","saturday"};
//分行输出days数组指向的字符串
#include<stdio.h>
int main(){
int i;
char *days[7]={"Sunday","Monday","Tudesday","Wednesday","Thursday","Friday","saturday"};
for(i=0;i<7;i++)
puts(days[i]);
}
puts();存放地址
08简单变量的指针作为函数参数
简单变量指针作函数参数,实现简单变量的地址在函数中的传递任意输入两个整数,降序输出。
void swap(int *p1,int*p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
#include<stdio.h>
int main(){
void swap(int *,int *);
int x,y;
scanf("%d,%d",&x,&y);
if(x<y)
swap(&x,&y);
printf("%d,%d\n",x,y);
}
void swap(int x,int y){
int t;
t=x;
x=y;
y=t;
}
#include<stdio.h>
void main(){
void swap(int x,int y);
int x,y;
scanf("%d,%d",&x,&y);
if(x<y)
swap(x,y);
printf("%d,%d\n",x,y);
}
两者的区别是一个是地址,一个是值
用比较交换法,将一位数组的最大值移到数组的最末元素位置,交换过程用上述swap()函数实现。
#include<stdio.h>
int main(){
void swap(int *,int *);
int i,a[10]={33,-12,97,3,7,18,9,51,10,9};
for(i=0;i<9;i++)
if(a[i]>a[i+1])
swap(&a[i],&a[i+1]);
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
}
void swap(int *p1,int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}