1.关于指针的一些讲解

本文详细介绍了C语言中的指针概念,包括指针变量的定义、赋值及指针在变量交换和函数参数传递中的应用。通过实例展示了如何使用指针进行内存地址操作,以及指针在不改变原始变量值的情况下实现数据转换。同时,讨论了指针在函数调用中的错误用法及其修正,并提供了一个输入三个整数并按从大到小顺序输出的示例。
摘要由CSDN通过智能技术生成

1.先来过一遍指针的概念

int a;char b;float c;

这里定义三种不同类型的变量

由它们所占字节数可得表:

int achar bfloat c
1byte1byte1byte1byte1byte1byte1byte1byte1byte
100110021003100410051006100710081009

a的内存地址为1001,b为1005,c为1006

那么我现在要找a,就要找到a的地址1001,找到这个地址,就可以把a的值取出来

那么通过地址找到所需的变量单元,就叫做:地址指向变量单元

那么指针就是这样一个变量的地址,可以说,指针是一个地址

接下来定义一个指针变量

“*” + “p”指针变量名

int 类型 也是该指针变量的类型,它只能指向int类型的变量

int *p;

指针变量,可不可以理解为是地址变量,也就是说,指针变量是存放地址的变量,指针变量的值是存放地址的变量

接着来完善这个指针的赋值,否则它毫无意义

int *p;
int a=2;
p=&a;

"&"是取地址符,“&a”很显然是去了a的地址,p=&a就是把a的地址给了p,那么取p所指向地址中的值就是*p=2

也就是

printf("%d",*p);

 结果是2

很显然,上面的操作,明明可以直接

printf("%d",a);

来实现,指针好像是绕远了,但是想必大家都明白,指针不那么简单,它的作用远远不止于此

以下,补充一些指针引用的简单方式和一些细节:

1.这里printf函数中p前没有加“*”

#include<stdio.h>
int main(void){
  int *p;
  int a=2;
  p=&a;
  printf("%d",p);
return 0;
 } 

 那么会出现下面的结果:

或者这样 

 原因:*p是所指向地址中的值,而p是地址,在printf函数中,打印出来的是a的地址的值,而不是a地址中的值,又由于地址值是随机的,所以会打出不同的结果

2.一个等价式子

*p=*&a=a

这个式子三个表达形式都表示赋给a的值

3.引用指针变量示例

我们来看一个例子

//输入a,b两个整数,按从大到小的顺序输出
#include<stdio.h>
int main(void){
    int *p1,*p2,*p,a,b;
    scanf("%d,%d",&a,&b);
    p1=&a;p2=&b;    //首先给指针变量赋地址
    if(a<b)//先判断条件
     {p=p1;p1=p2;p2=p;} //如果a<b,利用空指针实现地址的转换,此时*p1=b,*p2=a
     printf("%d,%d\n",*p1,*p2);   //输出结果先大后小
   
   return 0;
  }

我们输入2,9来测试,结果如下(注意输入的形式要与%d,%d相同,中间有逗号输入时要打上):

要注意,对指针变量进行交换,a,b的值不变

4.指针变量作为函数参数示例

上一个例子中,利用了指针在不改变a,b值的情况下实现了数值的转换,这个例子中,指针变量将作为参数参与函数的运算

//原理与3.中相同,实现输出最大值,最小值
#include<stdio.h>
void swap(int *p1,int *p2);//声明函数
int main(void){
    int a,b,*po1,*po2;
    scanf("%d,%d",&a,&b);
    po1=&a;po2=&b;
    if(a<b) swap(po1,po2);//函数调用
    printf("max=%d,min=%d\n",a,b);
    return 0;
 }
//定义函数
void swap(int *p1,int *p2){
    int temp;//创建空变量
    temp=*p1;   //转换操作
    *p1=*p2;
    *p2=temp;
}
    

可以看到,这里是将3.中的交换步骤改为引用函数来解决

我想会有这样几个问题

1.引用函数时

swap(*po1,*po2);

这样,结果会是: 

 原因:与函数的定义不同

void swap(int *p1,int *p2)

这里面是int *p1,也就是说,定义一个指针变量,不是说取一个指针变量,而引用函数,要保证给这个函数已经定义好的指针变量,也就是po1,po2,而若给*po1,*po2,则相当于给了两个常量值,这样自然不对。

2.函数定义有误

void(int *p1,int *p2){
    int *temp;
    *temp=*p1;
    *p1=*p2;
    *p2=*temp;
 }

//很明显,这里定义了一个指针变量*temp,看似下面的交换赋值无误,但是不要忘了,指针变量还没有被赋予一个地址,也就是说,还没完成这个定义(具体可看文章开头)

接下来,再看一个例子,加深印象

实现输入三个整数,按照从大到小顺序输出

#include<stdio.h>
void exchange(int* q1, int* q2, int* q3);//声明两个函数
void swap(int* pt1, int* pt2);
int main(void) {
	int a, b, c, * p1, * p2, * p3;
	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);
	
	return 0;
}
void exchange(int* q1, int* q2, int* q3) {
	if (*q1 < *q2) swap(q1, q2);//引用函数,比较主函数中p1,p2,p3地址中值的大小
	if (*q1 < *q3) swap(q1, q3);//利用swap函数三次引用实现三个数的交换
	if (*q2 < *q3) swap(q2, q3);
}
void swap(int* pt1, int* pt2) {
	int temp;
	temp = *pt1; *pt1 = *pt2; *pt2 = temp;//熟悉的操作
}

我们输入2,3,4(注意逗号是英文输入法的),结果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值