2

我对 C 中的指针有疑问。

[1] char *somestring = "somestring"

[2] int *someint = 45

为什么 [1] 有效而 [2] 无效?

为什么我们要

printf("%s",str1);

并不是

printf("%s",*str1);

?

4

6 回答 6

5

在 C 中,文字字符串基本上是一个(只读)字符数组,所以 char*(是的,它应该是 const char*,但这已经被历史遗忘了)。文字 int 不是数组或指针,因此创建指向它的指针是无意义的。类型不匹配。

于 2013-05-01T08:33:57.000 回答
1
[2] int *someint = 45

不起作用,因为您不能在没有显式转换的情况下将 int 转换为 int *。

编辑:实际上,我只是尝试编译一个示例代码,它在 linux 下使用 GCC 4.7 编译,但它会打印出一条警告消息。

45 被认为是一个整数。

[2] int *someint = (int *) 45

关于printf,%s意味着,%schar *数组替换, 当你到达时停止'\0'

于 2013-05-01T08:35:28.077 回答
1

char *somestring = "somestring"中,“somestring”是字符列表/数组。

而在int *someint = 45 45中只是一个整数,而不是整数列表/数组。它等效于char *somestring = 'a'which 无效。

于 2013-05-01T08:35:51.830 回答
1

例如,当您声明一个字符串文字"somestring"时,编译器在编译时就知道这一点,并将其放入程序中单独的内存部分。然后编译器将此位置的内存地址分配给您的字符串指针。

另一种方法是将字符串的字符存储在堆栈上:

char someString[] = { 's', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0 };

因为整数小于字符串(并且适合内存位置),所以它通常只是在堆栈中删除。

int someInt = 45;
于 2013-05-01T08:37:39.723 回答
1
int *someint = 45;

和说的一样:

int *someint;
someint = 45;

这将与警告一起编译:

initialization makes pointer from integer without a cast

如果你转换它,它将在没有警告的情况下编译:someint = (int *)45;.

这是因为,您基本上是在说 的“值”someint存储在地址 45 或0x2d,这显然不是声明​​时的情况。

您现在可以通过取消引用来添加值:*someint = someval;。所以现在someval将存储在您之前指定的地址(尽管这可能不起作用,具体取决于操作系统已经存储在那里的任何内容)。

我希望这能解决问题。

于 2013-05-01T08:49:47.967 回答
1

从问题的第一部分开始,让我们看看使用语句时会发生什么:

char *somestring = "somestring";

在这里,您声明了一个character pointer somestring,该字符串somestring存储在内存中的某个地址,并且该地址被分配给指针somestring(相信我,对指针和它所指向的字符串的内容使用相同的名称会令人困惑,正如你所做的那样!!)

现在您可以使用这个指针来引用该字符串somestring

现在看看,下面的语句有什么不同,会产生错误:

int *someint = 45

在这里,您声明了一个整数指针someint(类型int*),但为其分配了一个整数值(类型int)。不仅存在type不匹配,而且会产生不可预知的行为,因为您不知道地址 45.I假设这是您需要的:

 int num=45,*someint=#

这里运算符的& 地址将变量的地址分配给num指针,您可以使用*运算符取消引用它,如下所示:

  printf("The value pointed by the pointer is ",*someint);

注意* beforesomeint在声明语句中和作为printf().

来到你问题的第二部分,为什么我们使用str1inprintf()而不是*str1,嗯,str1表示字符串的基地址,它只不过是数组中第一个字符的地址。所以按照我告诉你的关于*运算符的内容,*str1是指存储在数组基址的字符,即数组的第一个字符。运行以下代码,就会清楚:

#include<stdio.h>

int main(void)
{   
     char str1[10]="Davies";

     printf("str1 is : %s \n but *str1 is : %c",str1,*str1);
}

输出 str1 is : Davies

        but *str1 is : D
于 2013-05-01T09:26:20.713 回答