字符和双指针声明

时间:2018-09-26 00:30:04

标签: c pointers

我从C编程语言开始,对指针的初始化感到怀疑。我知道当我们声明一个指针时,我们将为特定的指针保留内存,但是该指针可能指向我们一无所知的x地址,关键是我可以这样做:  char * s = "Hi";,但我无法做到这一点double * f = 3;,因此我要“初始化”这个双指针的工作是下一段代码:

double * d;
double x = 3;
d = &x;

这样,我便有了一个指向要具有初始值的特定存储位置的指针。

总结一下,我的疑问是:

1.-有什么方法可以像使用char一样初始化double / int指针吗?

2 个答案:

答案 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;