指针或许可以浅显的理解为一个中间值。在调用或运算时是调用其指向的另一个值或者变量。可以简化 C 编程任务的执行,动态内存分配时必须用到指针。
- 指针是用来存放内存地址的变量
- 指针类型必须与被指向类型相同
- 如果暂时无明确地址,赋予 NULL 值,称为空指针。 地址为 0x0
按照惯例,写一个方法实践一下:
int var_demo()
{
int a = 9;//声明实际变量
int *var;//声明指针变量
var = &a;//在指针中存储变量的地址
double *aac = NULL;
printf("指针输出测试:%d\n", a);
printf("指针输出测试:%d\n", &a);
printf("指针输出测试:%d\n", var);
printf("指针输出测试:%d\n", *var);
printf("指针输出测试:%d\n", aac);
}
下面学习一些与指针相关的概念
- 指针的算术运算
-
可以对指针进行 “++,--,-,+”四种运算
-
增加一次将指向下一个元素的位置。 例如指向位置1000的整数增加一之后,向后移动4字节,变为1004。
-
递增递减跳跃的字节数取决于指针所指变量类型的长度
-
递增递减多用于代替数组
-
指针也可以用关系运算符 “==,<,>”进行比较
printf("指针算数测试:\n"); printf("指针输出测试:%d\n", var); printf("指针输出测试:%d\n", *var); var++; printf("指针输出测试:%d\n", var); var++; printf("指针输出测试:%d\n", var); printf("指针输出测试:%d\n", *var); int arr[] = { 1 ,22 , 44, 55 }; int arc[] = { 1 ,22 , 44, 55 }; int *ar = arr; int *ac = arc; for (int a = 0; a < 4; a++) { printf("存储地址:%d\n", ar); printf("存储地址:%d\n", *ar); ar++; } while (ac <= &arc[3]) { printf("存储地址:%d\n", ac); printf("存储地址:%d\n", *ac); ac++; }
-
- 指针数组
本质就是在数组前加 "*" 将数组变为指针数组。调用时直接调用指针数组名即可。
int *vcc[4];
char *names[] = {
"ceshi",
"nihao",
"hello",
"world",
};
int vrc[] = { 1,2,3,4 };
for (int a =0 ; a <4 ; a++)
{
vcc[a] = &vrc[a];
}
for (int a = 0; a < 4; a++)
{
printf("vcc[%d] = %d \n", a, *vcc[a]);
printf("names[%d] = %s \n", a, names[a]);
}
- 指向指针的指针
指向指针的指针,就是指向指针位置的指针。在指针前多加一个 “*” 就是指向指针的指针
int nui = 1;
int *nu = &nui;
int **n = ν
printf("指针指针测试:%d \n", nui);
printf("指针指针测试:%d \n", nu);
printf("指针指针测试:%d \n", *nu);
printf("指针指针测试:%d \n", *n);
printf("指针指针测试:%d \n", **n);
- 传递指针给函数
只需要添加 “*” 符号即可
double getAverage(int *arr, int size);
- 从函数返回指针
首先需要声明一个返回指针的函数,即在函数名前加 *
其次返回的变量不能返回 局部变量 ,返回全局变量或者在变量前加标识符 static