gpt4 book ai didi

c - 简洁地声明和初始化指针(即指向 int 的指针)

转载 作者:太空狗 更新时间:2023-10-29 17:06:17 24 4
gpt4 key购买 nike

给定指向 char 的指针,可以执行以下操作:

char *s = "data";

据我了解,这里声明了一个指针变量,为变量和数据都分配了内存,后者用data\0填充,并且有问题的变量被设置为指向它的第一个字节(即变量包含一个可以取消引用的地址)。这是简短而紧凑的。

例如,给定指向 int 的指针,可以这样做:

int *i;
*i = 42;

或者那个:

int i = 42;
foo(&i); // prefix every time to get a pointer
bar(&i);
baz(&i);

或者那个:

int i = 42;
int *p = &i;

这有点同义反复。它很小并且可以容忍一次使用单个变量。但是,它不会多次使用多个变量,从而导致代码困惑。

有什么方法可以干巴巴地写出同样的东西?这些是什么?是否有更广泛的编程方法可以完全避免该问题?可能我根本不应该使用指针(开玩笑)之类的?

最佳答案

字符串文字是一种极端情况:它们会触发在静态内存中创建文字,并将其作为 char 数组进行访问。请注意,尽管 42int 文字,但以下内容不会编译,因为它不是隐式分配的:

int *p = &42;

在所有其他情况下,您负责分配指向的对象,无论是在自动内存还是动态内存中。

int i = 42;
int *p = &i;

这里的i是一个自动变量,p指向它。

int * i;
*i = 42;

您刚刚调用了未定义行为。 i 尚未初始化,因此随机指向内存中的某处。然后您将 42 分配给这个随机位置,结果不可预知。不好。

int *i = malloc(sizeof *i);

此处 i 被初始化为指向一个动态分配的内存块。完成后不要忘记 free(i)

int i = 42, *p = &i;

这里是如何创建一个自动变量和一个指向它的指针的方法。 i 是变量,p 指向它。

编辑:您似乎真的希望隐式和匿名分配该变量。好吧,这是你可以做到的:

int *p = &(int){42};

这个东西是复合文字。它们是具有自动存储持续时间(或在文件范围内是静态的)的匿名实例,并且仅存在于 C90 及更高版本中(但不存在于 C++ 中!)。与字符串文字相反,复合文字是可变的,即您可以修改 *p

编辑 2: 添加此解决方案的灵感来自 another answer (不幸的是提供了错误的解释)为了完整性:

int i[] = {42};

这将分配一个具有自动存储持续时间的单元素可变数组。数组的名称,while not a pointer itself , 将根据需要衰减为指针。

但是请注意,sizeof i 将返回“错误”结果,即数组的实际大小 (1 * sizeof(int)) 而不是大小指针 (sizeof(int*))。然而,这应该很少成为问题。

关于c - 简洁地声明和初始化指针(即指向 int 的指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com