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

use*_*273 7 c pointers dry

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

char *s = "data";
Run Code Online (Sandbox Code Playgroud)

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

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

int *i;
*i = 42;
Run Code Online (Sandbox Code Playgroud)

或者那个:

int i = 42;
foo(&i); // prefix every time to get a pointer
bar(&i);
baz(&i);
Run Code Online (Sandbox Code Playgroud)

或者那个:

int i = 42;
int *p = &i;
Run Code Online (Sandbox Code Playgroud)

这有点同义反复.使用单个变量时,它很小且可以容忍.但是,它并没有对多个变量进行多次使用,从而导致代码混乱.

有没有办法干燥简洁地写同样的东西?这些是什么?有没有更广泛的编程方法,可以完全避免这个问题?可能我不应该使用指针(笑话)或什么?

Que*_*tin 15

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

int *p = &42;
Run Code Online (Sandbox Code Playgroud)

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

int i = 42;
int *p = &i;
Run Code Online (Sandbox Code Playgroud)

i是一个自动变量,p指向它.

int * i;
*i = 42;
Run Code Online (Sandbox Code Playgroud)

您刚刚调用了未定义的行为.i尚未初始化,因此在内存中随机指向某处.然后你分配42到这个随机位置,带来不可预测的后果.坏.

int *i = malloc(sizeof *i);
Run Code Online (Sandbox Code Playgroud)

这里i初始化为指向动态分配的内存块.free(i)一旦你完成了它,别忘了.

int i = 42, *p = &i;
Run Code Online (Sandbox Code Playgroud)

以下是如何创建一个自动变量和指向它的指针作为单行.i是变量,p指向它.

编辑:似乎你真的希望隐式和匿名分配该变量.那么,你可以这样做:

int *p = &(int){42};
Run Code Online (Sandbox Code Playgroud)

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

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

int i[] = {42};
Run Code Online (Sandbox Code Playgroud)

这将分配具有自动存储持续时间的单元素可变数组.数组的名称虽然不是指针本身,但会根据需要衰减为指针.

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