保持空杯心态,在了解的基础上明白,继而熟悉,终于熟练。
今天分享的是c语言指针的部分用法:
一、一个简单的例子切入指针
int a = 5;
int *ptr = &a;
非常简单的指针的声明和初始化,但是你对此认识多少?是否在学习指针的时候有过疑问?
解释:
int a = 5;
: 这是一个整数变量a
,其值为 5。int *ptr = &a;
: 这是一个指针变量ptr
,它被初始化为a
的地址。
如果你曾经对指针绕晕过,不知道你有没有过这样的疑问:ptr? *? int? *ptr? int* ptr? int *ptr?
int : 数据类型
ptr
:是一个指向 int
类型的指针,它用于存储 int
类型变量的地址。
*:是指针变量
ptr:变量名称(如果你喜欢可以是阿猫阿狗,但要注意命名规范)
int* ptr = int *ptr :含义和用法相同,只是写法不同,都代表名为ptr是一个指向int类型的指针,用于存储地址。
二、进一步了解指针
在学习指针的过程中,相信你肯定不止于一次看见过“*”这个符号,上面的切入只是一个*出现,那多个*出现,你知道怎么消化吗?
1. 多级指针
又称指向指针的指针。多级指针可以用于访问和修改指针变量。通过指向指针的指针,可以在函数中修改指针的值。
例如:int **p
是一个指向 int *
类型的指针,而 int *p
是一个指向 int
类型的指针。
#include <stdio.h>
// 函数声明
void setPointer(int **ptr);
int main() {
int value = 42; // 定义一个整数变量
int newValue = 99; // 定义另一个整数变量
int *p = &value; // 定义一个指针并初始化为指向 value 的地址
// 打印 p 当前指向的值
printf("Before function call: *p = %d\n", *p);
// 调用函数,传递指针 p 的地址
setPointer(&p);
// 打印 p 现在指向的值
printf("After function call: *p = %d\n", *p);
return 0;
}
// 函数定义
void setPointer(int **ptr) {
int newValue = 99; // 定义一个新的整数变量
*ptr = &newValue; // 修改传入的指针,使其指向 newValue 的地址
}
int **ptr
:ptr
是一个二级指针,表示它是一个指向int *
的指针。*ptr = &newValue;
:*ptr
解引用ptr
,得到一个int *
指针,然后将它指向newValue
的地址。这个操作会修改p
的指向,使其指向newValue
的地址。int *p = &value;
:定义一个指针p
,并使其指向value
的地址。setPointer(&p);
:传递p
的地址(&p
),使setPointer
函数能够修改p
的值。*p
:解引用指针p
,访问它指向的值。
注:
- 传递
p
的地址(&p
)到setPointer
。 ptr
在setPointer
中指向p
,因此*ptr
就是p
。- 修改
*ptr
(即p
)指向newValue
的地址。