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;//定义一个指针去指向变量aint* 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);//88return 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 20swap(a, b);//仅仅把a和b的值传递过去printf("调用后:%d %d\n", a, b);//调用后:10 20return 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;
}