我从C编程语言开始,对指针的初始化感到怀疑。我知道当我们声明一个指针时,我们将为特定的指针保留内存,但是该指针可能指向我们一无所知的x地址,关键是我可以这样做:
char * s = "Hi";
,但我无法做到这一点double * f = 3;
,因此我要“初始化”这个双指针的工作是下一段代码:
double * d;
double x = 3;
d = &x;
这样,我便有了一个指向要具有初始值的特定存储位置的指针。
总结一下,我的疑问是:
1.-有什么方法可以像使用char一样初始化double / int指针吗?
答案 0 :(得分:4)
是的,但是您通常不应该:
double *x = (double []) {3};
就像char *x = "Hi";
创建char
的数组并初始化x
以指向该数组的第一个成员一样,上面的代码创建double
的数组并初始化x
指向其第一个成员。 (我只显示了一个元素,但您可以编写更多内容。)这称为复合文字。
一个重要的区别是字符串文字的生存期是程序的整个执行过程,因此您可以安全地从函数返回其地址。相反,仅在函数执行期间,函数内部才会存在复合文字,因此无法从函数返回其地址。如果此定义出现在函数之外,则在程序的整个执行过程中都将存在复合文字。
复合文字有时很有用,但是如上所示,初始化指向复合文字地址的指针的情况非常有限。这样的代码应克制和谨慎使用。
答案 1 :(得分:2)
最好的办法是使用数组而不是原始指针。由于数组在几乎所有用例中都会退化为指针,因此它会表现大致与您想要的方式一样。
double d[] = {3};
将分配空间(全局还是在堆栈上,取决于它是在全局作用域还是在函数作用域执行),并立即对其进行初始化。出于几乎所有目的,引用d
会使它降级为double*
。
主要区别在于,对于堆栈分配的数组(函数作用域,不带static
限定符),该数组仅存在直到函数调用结束。将其声明为static double d[] = {3};
会使它在程序的生命周期内有效,但是它将只有一个初始化,并且所有更改都将无限期存在。
另一个重要的区别是您不能修改地址,因为它不是真正的指针。 ++d
是非法的,因为d
是一个数组,而不是指针。
要获得与char *s = "Hi";
完全相同的价格,基本上您只能使用两层。该代码大致等效于:
static char unnamed[] = {'H', 'i', '\0'};
char *s = unnamed;
这是C字符串文字的一种特殊行为,其他任何类型都没有直接语言支持。用double
精确地模拟它总是两个衬里:
static double dstorage[] = {3};
double *d = dstorage;