C语言基础之指针1

什么是指针?

指针在C语言中相当于内存地址

指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

指针变量的定义格式

数据类型 * 变量名

使用注意细节

注意:数据类型要跟指向变量的数据类型保持一致;* 表示标记该变量为指针变量

注意:指针变量占用的大小,跟数据类型无关,跟编译器有关;给指针变量赋值的时候,不能把一个数值赋值给指针变量

注意:函数中变量的生命周期跟函数相关,函数结束,变量也会消失,此时在其他函数中,就无法通过指针使用,如果不想函数中的变量被回收,可以在变量前面加static关键字

#include<stdio.h>
int* method();
int main() {
	//调用method函数,并使该函数中的变量
	int* p = method();
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("%d\n", *p);//不能打印,因为method函数结束后,该函数中的所有变量都会消失
	return 0;
}
int* method() {
	int a = 10;
	return &a;
}
运行结果:
拖延时间
拖延时间
拖延时间
拖延时间
拖延时间
拖延时间
-858993460
解决办法:在变量前加static关键字
int* method();
int main() {
	//调用method函数,并使该函数中的变量
	int* p = method();
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("拖延时间\n");
	printf("%d\n", *p);//不能打印,因为method函数结束后,该函数中的所有变量都会消失
	return 0;
}
int* method() {
	static int a = 10;
	return &a;
}
运行结果:
拖延时间
拖延时间
拖延时间
拖延时间
拖延时间
拖延时间
10

定义指针变量
	int a = 10;
	int* p1 = &a;
打印内存地址
	printf("%p\n", p1);
	double b = 10;
	double* p2 = &b;

指针的作用

利用*(解引用运算符)可以查询数据,存储数据

查询数据

#include<stdio.h>
int main() {
	int a = 10;
	//定义一个指针去指向变量a
	int* p = &a;
	//利用指针去获取变量中的数据
	printf("%d\n", *p);
	return 0;
}

存储(修改)数据

int main() {
long g = 89L;
//	//定义一个指针去指向变量
long* p3 = &g;
//	//利用指针去获取变量中的数据
printf("%ld\n", *p3);//89
//	//利用指针去修改数据
*p3 = 88L;
//	//打印输出
printf("%ld\n", *p3);//88
printf("%ld\n", g);//88
	return 0;
}

操作其他函数中的变量

#include<stdio.h>
/*
交换变量中记录的值
定义两个变量,要求交换变量中记录的值
//注意:交换的代码写在一个新的函数swap中
*/
void swap(int num1, int num2) {//仅仅交换的是num1和num2中记录的值
	int temp = num1;
	num2 = num1;
	num2 = temp;
}
int main() {
	//定义两个变量;
	int a = 10;
	int b = 20;
	//调用swap函数
	printf("调用前:%d %d\n", a, b);//调用前:10 20
	swap(a, b);//仅仅把a和b的值传递过去
	printf("调用后:%d %d\n", a, b);//调用后:10 20
	return 0;
}
//声明函数
void swap(long* num1, long* num2);
int main() {
	//定义两个变量;
	long a = 89L;
	long b = 78L;
	//调用swap函数
	printf("调用前:%ld %ld\n", a, b);
	swap(&a, &b);
	printf("调用后:%ld %ld\n", a, b);
	return 0;
}
//定义函数,交换的是num1指向的变量和num2指向的变量的值
void swap(long* num1, long* num2) {
	int temp = *num1;
	*num1 = *num2;
	*num2 = temp;
}

函数返回多个值

#include<stdio.h>
//定义一个函数,求数组的最大值和最小值,并进行返回
void getMaxAndMin(int arr[], int len, int* max, int* min) {
	//求数组的最大值
	*max = arr[0];
//求数组的最小值
	*min = arr[0];
	for (int i = 1; i < len; i++) {
		if (arr[i] > *max) {
			*max = arr[i];
		}
        if (arr[i] < *min) {
			*min = arr[i];
		}
	}
}
int main() {
	//定义数组
	int arr[] = {1,2,3,4,5,6,7,8,9,10 };
	int len = sizeof(arr) / sizeof(int);
	//调用函数
	int max = arr[0];
	int min = arr[0];
	getMaxAndMin(arr, len, &max, &min);
	printf("数组的最大值为:%d\n", max);
	printf("数组的最小值为:%d\n", min);
	return 0;
}

函数的结果和计算状态分开

//定于一个函数,将两个数相除,获取他们的余数
//返回值:表示计算的状态:0 正常  1 不正常
int getRemainder(int num1, int num2, int* res) {
	if (num1 % num2 == 0) {
		//停止
		return 0;
	}
	*res = num1 % num2;
	return 0;
}
int main() {
	//定义两个变量
	int a = 90;
	int b = 8;
	int res;//余数
	//调用函数
	int flag = getRemainder(a, b, &res);
	if (!flag) {
		printf("获取两个数的余数为:%d\n", res);//2

	}
	return 0;
}

方便操作数组和函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值