基本概述
在C语言中,使用int、float、char等值类型定义的作用是申请一块相应大小的内存地址,用来保存数据。
如果要在函数之间传递这些数据、就需要有两种方式,第一种是数据拷贝,将数据拷贝到函数运行时创建的形参地址中去,再使用,第二种就是指针传递数据地址给函数内部,函数内部再使用数据。
void test(int *a) // 指针形参 保存函数调用传进来的内存地址。
{
int c = *a; // 解引用 读取a指针指向的地址里面的内容
}
int main()
{
int b = 1000;
test(&b); // &b获取变量b所在的内存地址
}
注意事项:
1、 int *a,和char *a 这俩指针变量占据的内存空间是一样的。
2、 不能返回指向函数内部的变量地址的指针,函数执行结束,内部变量会回收。
3、 const int *a 指针指向的变量是个常量、。
4、 int *const a是指针本身是一个常量,在用之前就需要初始化。
指针数组和数组指针
指针数组
类似 int *a[] 作用是,数组的内容都是指针。
示例:
#include <stdio.h>
int main()
{
int *a[5] = {0};
int b = 2;
int c = 3;
int d = 4;
a[0] = &b;
a[1] = &c;
a[2] = &d;
printf("输出的数值是%d,%d,%d \n", *a[0], *a[1], *a[2]);
}
// 输出的数值是2,3,4
数组指针
类似int (*a)[]
示例:
#include <stdio.h>
int main()
{
char(*a)[4];
char str[12] = {'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0', 'g', 'h', 'i', '\0'};
a = (char (*)[4])str;
printf("输出的数值是%s,%s,%s \n", a, a + 1, a + 2);
}
// 输出的数值是abc,def,ghi
以上这种声明定义方式的作用是声明一个指针部长为sizeof(类型)*[长度] 的指针,采取这种方式的好处是可以灵活的控制指针步长来进行访问。
像上面的demo,就是步长为sizeof(char) *4 所以是 a+1之后直接访问到'd'。
这里需要注意的是类型的转换,char数组本身可以理解为char 类型,要把这个地址赋值给char ()[4] 这个类型,就需要进行一个强制类型转换。