将String Literal的地址分配给指针

时间:2015-10-12 15:33:07

标签: c gcc

将字符串文字的地址分配给字符指针有什么不同吗?

char *ptr = &"Hello";
printf("%s",ptr);

打印时,正确打印“Hello”。 这类似于将数组的地址分配给指针吗?有这种方式分配地址吗? &“Hello”会返回什么?指向字符的常量指针?

char a[]="Hi";
char *ptr2 = &a;

此外,& a + 1将打印正好在数组边界之外的地址。但是我们不能用它来获得它看起来的数组的大小。我尝试打印类似下面的数组内容,但它只打印一个字符。

for(i=0;i<((&a+1)-&a);i++)  printf("%c",*ptr2++);

2 个答案:

答案 0 :(得分:4)

char *ptr = &"Hello";

这是无效的。编译器会发出警告。

"Hello"的类型为char[6]&"Hello"的类型为char(*)[6]。像这样声明并初始化ptr -

char (*ptr)[6] = &"Hello";     // ptr is pointer to array of char of size 6

for循环中,您的情况 -

i<((&a+1)-&a);   // it should be i<(*(&a+1)-a);

不要这样做,因为它会调用 未定义的行为

To know more about it refer here.

答案 1 :(得分:3)

pe <- oprobit.result$par                # point estimates
vc <- solve(oprobit.result$hessian)     # var-cov matrix
se <- sqrt(diag(vc))                    # standard errors
ll <- -oprobit.result$value             # likelihood at maximum

> pe
(Intercept)         xx1         xx2                                                 
 1.14039048 -0.05864677  0.04268965  0.77838577  1.43517145  2.23191376  0.02237956 
> vc
 (Intercept)           xx1           xx2                                                        
 (Intercept)  2.704159e-03 -7.945238e-05  4.507541e-07  1.520451e-03  1.970613e-03  2.215032e-03  9.274348e-04
 xx1         -7.945238e-05  7.300705e-03  1.165960e-04 -9.066118e-06 -6.078438e-05 -1.046191e-04 -2.009612e-04
 xx2          4.507541e-07  1.165960e-04  2.850668e-03  3.795273e-05  3.951004e-05  3.506606e-05 -2.686577e-04
1.520451e-03 -9.066118e-06  3.795273e-05  2.107875e-03  1.860727e-03  1.728905e-03  9.524469e-05
1.970613e-03 -6.078438e-05  3.951004e-05  1.860727e-03  2.955453e-03  2.576940e-03  1.960465e-04
2.215032e-03 -1.046191e-04  3.506606e-05  1.728905e-03  2.576940e-03  4.262996e-03  2.723117e-04
9.274348e-04 -2.009612e-04 -2.686577e-04  9.524469e-05  1.960465e-04  2.723117e-04  5.636931e-03
> se
(Intercept)         xx1         xx2                                                 
 0.05200153  0.08544417  0.05339165  0.04591160  0.05436408  0.06529162  0.07507950 
> ll
[1] -1567.966

您的编译器应该已经警告过您。 char *ptr = &"Hello"; 的类型为"Hello"(字符串的长度加上终止char[6]空字符的1)。因此'\0'的类型为&"Hello",或指向6 char (*)[6]的数组的指针。没有从该类型隐式转换为char

如果您想要指向字符串的指针,请删除char*

&

这利用了一个规则,即数组类型的表达式(例如const char *ptr = "Hello"; )被隐式转换为指向数组第一个元素的指针。(如果数组是a的操作数,则不进行此转换一元"Hello"&运算符,或者是用于初始化数组对象的字符串文字。)

(我添加了sizeof因为它更安全;你无法合法地修改字符串文字的内容,const提醒编译器不要让你尝试。感谢Bathsheba提醒我。)(实际上修改内容有不确定的行为。长篇故事。)

您会注意到const指向字符串的第一个字符,而不指向整个字符串。这(可能)正是你想要的。在C中,数组通常通过指向其元素的指针来操作,而不是通过指向整个数组的指针来操作。指针算法用于遍历数组并访问其所有元素。

重要的是要记住,构造指向数组初始元素的指针不记得数组的大小。你必须自己跟踪。如果数组包含字符串,您通常会查找终止ptr,或使用执行此操作的函数。对于其他阵列,通常分别存储长度。例如,一个函数可能有两个参数,一个数组的初始元素的地址和一个包含元素数量的整数('\0')。

建议阅读:comp.lang.c FAQ的第6部分。