如何定义指针变量
普通变量:
数据类型 变量名称;
指针变量:
数据类型 * 变量名称;
数据类型 : 说明将来指针变量能够保存什么类型的变量的地址
注意: 指针变量是什么类型, 那么将来就只能保存什么类型变量的地址,
例如: 指针变量是int类型, 那么将来就只能保存int类型变量的地址
* : 没有任何特殊含义, 仅仅是为了标示这是一个指针变量
变量名称 : 用于区分不同的变量
int num; // 普通变量
num = 10;
int *p; // 指针 , 在64位编译器下占用8个字节
// 千万注意: 指针变量只能存储地址
p = # // 将num的地址存储到p这个指针中
// p == &num
printf("num = %p\n", &num);
printf("p = %p\n", p);
// 指针变量前的*号代表访问指针变量指向的那一块存储空间
// *p == num
*p = 55;
printf("num = %i\n", *p);
/ 指针就是专门用于保存地址的
void change3(int *p) // 用什么接收地址? 指针 = 0ffc13 int *p = #
{
*p = 55;
printf("哥被执行了\n");
}
1、交换两个变量的值
#include <stdio.h>
void swap(int *v1, int *v2)
// int *v1 = &a, int *v2 = &b; v1 = 0ffc13 v2 = 0ffc9
// *v1 == a *v2 == b
{
int temp = *v1; // int temp = 0ffc13
*v1 = *v2;
*v2 = temp;
}
int main(int argc, const char * argv[]) {
// 定义一个函数交换两个变量的值
int a = 10; // 0ffc13
int b = 5; // offc9
printf("交换前:a = %i, b = %i\n", a, b);
// int temp = a;
// a = b;
// b = temp;
swap(&a, &b);
printf("交换后:a = %i, b = %i\n", a, b);
return 0;
}
2、定义一个函数, 传递三个值, 返回这三个值得和,差,平局值
#include <stdio.h>
//int demo(int v1, int v2, int v3);
int demo(int v1, int v2, int v3, int *p1, int *p2);
int main(int argc, const char * argv[]) {
// 要求定义一个函数, 传递三个值, 返回这三个值得和,差,平局值
int a = 10;
int b = 20;
int c = 30;
// int res = demo(a , b , c);
// printf("res = %i\n", res);
// 定义三个变量用于保存计算结果
int res1 = 0; // 和
int res2 = 0; // 差
// int res3 = 0; // 平局值
// *p1 == res1 *p2 == res2
// 我们想要的就是调用完函数之后, 和差平均值对应的变量都被"修改"为对应的值
int res3 = demo(a, b, c, &res1, &res2);
printf("和 = %i, 差 = %i, 平均值 = %i\n", res1, res2, res3);
return 0;
}
int demo(int v1, int v2, int v3, int *p1, int *p2)
{
int sum = v1 + v2 + v3;
*p1 = sum;
int m = v1 - v2 - v3;
*p2 = m;
int average = sum / 3;
return average;
/*
// 因为返回的是一个逗号表达式, 而逗号表达式的值是最后一个表达式的值, 所有返回的是average
// return sum, m, average;
*/
/*
// return 连个作用 1.返回值给调用者 2.结束函数
// 注意点: return后面不可以写任何语句, 因为执行不到
return sum;
printf("--------------\n");
return m;
return average;
*/
}
指针注意点
指针的指向可以修改
int a = 10;
int b = 5;
int *p = &a;
*p = 88;
p = &b;
*p = 44;
printf("%i\n", a);
printf("%i\n", b);
指针类型是什么类型, 就只能指向什么类型的数据
多级指针
指向指针地址的指针,保存的是指针的地址。
指针为什么分类型
因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值
mac(64位)系统上,指针无论什么类型,都占8个字节,因为
64=8*8
/*
char *cp;
int *ip;
double *dp;
double **dpp;
// mac系统中的指针无论是什么类型, 几级真正都占用8个字节
// 由于Mac是64位了, 32 = 4 * 8; 64 = 8 * 8;
printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));
*/
// 指针为什么要分类型?
// 因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值