指针 就是 内存地址
// 指针变量的定义格式
数据类型 * 变量名
| | |
| | 自己起的名字
| 标记
要跟指向变量的类型保持一致
// 例子
int a = 10;
int* p1 = &a;
double b = 10;
double* p2=&b;
指针的作用: 查询数据、存储数据、参数传递、内存管理等等
格式: *指针名
/*
int a = 1; int 指针 0x0011
int* p1 = &a; * 0x0011 10
*p p int a
*表示:解引用运算符
*/
#include
int main(){
// 利用指针去获取变量中的数据/存储数据
int a = 1;
// 定义一个指针去指向变量a
int* p = &a;
// 利用指针来获取变量中的数据
printf("%d\n", *p);
return 0;
}
格式: *指针名 = 数据值;
#include
int main(){
int a = 1;
int* p = &a;
printf("%d\n", *p);
// 利用指针去存储数据/修改数据
*p = 50;
printf("%d\n", *p);
printf("%d\n", a);
return 0;
}
指针的使用细节:
// 第3个注意细节
#include
int main(){
char c = 'a';
char* p1 = &c;
long long n = 100;
long long* p2 = &n;
printf("%zu\n", sizeof(p1)); // 8
printf("%zu\n", sizeof(p2)); // 8
return 0;
}
// 第4个注意细节
/*
int a = 10; int a = 10;
int* p = &a; int* p = 50;
这里的&a:赋值已分配空间的内存地址 这里的50:赋值未分配空间的内存地址
*/
指针的作用:
#include
void swap(int* p1, int* p2);
int main(){
// 定义两个变量,要求变换变量中记录的值
// 注意:交换的代码写在一个新的函数swap中
// 1.定义两个变量
int a = 10;
int b = 20;
// 2.调用swap函数
printf("调用前:%d, %d\n",a, b);
swap(&a,&b); // 调用a和b的地址
printf("调用后:%d, %d\n",a, b);
return 0;
}
void swap(int* p1, int* p2)
{
// 此时交换的是p1指向的变量和p2指向的变量的值
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
指针的作用细节: 函数中变量的生命周期与函数相关,函数结束对应的变量消失。此时在其他函数中,就无法通过指针使用。如果不想函数中的变量被回收,可以在变量前面加static关键字。
#include
int* method();
int main(){
// 调用method函数,并使用该函数中的变量a
int* p = method();
printf("拖时间!\n");
printf("%d\n",*p);
// 如果没有static,则结果不能打印的,因为method函数结束后,那么该函数里面所有的变量也会随之消失
return 0;
}
int* method()
{
static a = 10; // 此时,变量一直保存到程序结束
return &a;
}
#include
void max_min(int arr[], int len, int* max, int* min);
int main(){
int arr[] = {1,2,3,4,5,6,7,8,9};
int len = sizeof(arr) / sizeof(int);
int max = arr[0];
int min = arr[0];
max_min(arr, len, &max, &min); // 这里参数传入max和min的地址,也就是下面子函数中 【*地址(数据)】
printf("数组的最大值为%d\n", max); // 这里输出的max和min就是对应max、min地址里面存放的数据值
printf("数组的最小值为%d\n", min);
return 0;
}
void max_min(int arr[], int len, int* max, int* min) // 可以理解 数值==*地址
{
*max = arr[0]; // *max指针,如果max是传入的是max的地址,那么*max就是该地址存放的值
int i;
// 这个后面意思就是将数组的第一个值赋值给*max,然后依次进行查找,找到最大值,并且将最大值变量存在max地址里
for(i=0; i<len; i++)
{
if(arr[i]>*max)
{
*max = arr[i];
}
}
*min = arr[0];
for(i=0; i<len; i++)
{
if(arr[i]<*min)
{
*min = arr[i];
}
}
}
#include
int getReminder(int a, int b, int* res);
int main(){
// 定义一个函数,将两数相除,获取他们的余数
int a=10;
int b=3;
int rem = 0;
int flag = 0;
flag = getReminder(a, b, &rem);
if (!flag){
printf("余数为:%d\n",rem);
}
return 0;
}
int getReminder(int a, int b, int* res)
{
if(b==0) // 如果除数为0,则计算状态为1
{
return 1;
}
*res = a%b; // 如果除数不为0,则计算状态为0, 计算余数
return 0;
}