将字符串文字的地址分配给字符指针有什么不同吗?
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++);
答案 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);
但不要这样做,因为它会调用 未定义的行为 。
答案 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部分。