18.指针

  • 某变量所占用的内存空间的起始地址称为该变量的地址,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];

10203040
80        706050
18273645

问:

  • 如何使p指向首元素?
  • a[i][j]的指针如何表示?
p10a[0][0]
p+120        a[0][1]
p+230a[0][2]
p+340a[0][3]
p+480a[1][0]
p+570a[1][1]
p+660a[1][2]
p+750a[1][3]
p+818a[2][0]
p+927a[2][1]
p+1036a[2][2]
p+1145a[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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靳向阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值