指针
-
指针变量?
- 指针变量和普通变量一样, 都是用来保存数据的
- 只不过和普通变量有一点区别, 普通变量可以保存int/char/float/double等类型的数据
- 指针变量只能保存内存地址
- 简而言之, 指针变量, 就是专门用于保存内存地址的变量
-
指针变量的定义
int *p;
注意点:
所有的指针变量占用的内存大小都一样,在32位编译器中, 占用4个字节,在64位编译器中, 占用8个字节
int num;
num = 9;
int *p;
p = #
- 将num变量的占用内存最小的那个地址存储到指针变量p中
- 只要一个变量中存储了另外一个变量的内存地址, 那么我们就说这个变量指向了另外一个变量
- 只要一个变量中存储了另外一个变量的内存地址, 那么我们就可以根据这个内存地址找到另外一个变量的内存,从而操作那一块内存
printf("&num = %p\n", &num); // &num = 0060FEA8
// p和普通变量一样, 代表取出p中存储的值
printf("p = %p\n", p); // p = 0060FEA8
// printf("num = %i\n", num);
// &p和普通&变量也一样, 代表取出p自己的内存地址
printf("&p = %p\n", &p);
用指针访问内存空间
- 只要一个变量保存了另外一个变量的地址, 就代表这个变量指向了另外一个变量
- 只要一个变量指向了另外一个变量, 就可以通过*变量名称方式, 操作另外一个变量的内存空间(即解引)
// 1.定义一个普通变量
int num;
num = 6;
// 2.定义一个指针变量
int *p;
// 3.利用指针变量, 保存某个变量的地址
p = # // 将num的内存地址存储到了变量p中
printf("修改之前: %i\n", num);//6
// num = 8;
*p = 4; // 在指针变量前面加上*号, 代表访问指针指向的那块内存
printf("修改之后: %i\n", num);//4
printf("修改之后: %i\n", *p);//4
指针注意点
1.指针只能保存地址, 不能保存其它的值
2.一个变量可以被多个指针指向
3.指针的指向可以改变
4.定义指针变量时前面的数据类型, 必须和将来要保存的变量前面的数据类型一致
指针的内存表现
int num = 9;
int num2 = 10;
int *p1,*p2;
p1 = #
p2 = &num2;
指针具有类型
- 指针为什么要有类型?
-
由于指针变量指向的是某一个变量
-
所以在获取指向变量中存储数据的时候, 指针是不知道要获取多少个字节的数据的
-
所以指针变量的数据类型的作用, 就是告诉指针, 在获取指向变量的数据的时, 需要获取几个字节的数据
-
指针案例
#include <stdio.h>
//int sum(int num1, int num2);
void test(int num1, int num2, int *res1, int *res2, int *res3, int *res4);
int main()
{
// 需求: 要求定义一个函数, 可以同时返回两个变量的和,差,积,商
// 需要大家知道的是: 在C语言中, 默认情况下一个函数只能返回一个值
// 如果想让某一个函数同时返回多个值, 可以借助指针来实现
int a = 10;
int b = 20;
// int res = sum(a, b);
// printf("res = %i\n", res);
int d, e, f, g;
test(a, b, &d, &e, &f, &g);
printf("和 = %i\n", d);
printf("差 = %i\n", e);
printf("积 = %i\n", f);
printf("商 = %i\n", g);
return 0;
// printf("return 后面的语句\n");
}
/**
* @brief test 可以同时返回两个变量的和,差,积,商
* @param num1 参与运算的第一个变量
* @param num2 参与运算的第二个变量
* @param res1 和
* @param res2 差
* @param res3 积
* @param res4 商
*/
void test(int num1, int num2, int *res1, int *res2, int *res3, int *res4){
*res1 = num1 + num2;
*res2 = num1 - num2;
*res3 = num1 * num2;
*res4 = num1 / num2;
}
网友评论