关于C中char和int指针的一些疑问

时间:2013-05-01 08:31:57

标签: c

我对C中的指针有疑问。

[1] char *somestring = "somestring"

[2] int *someint = 45

为什么[1]有效,[2]没有?

为什么我们

printf("%s",str1);

而不是

printf("%s",*str1);

6 个答案:

答案 0 :(得分:5)

在C中,一个文字字符串基本上是一个(只读)字符数组,所以char *(是的,它应该是const char *,但是它会丢失到历史记录中)。文字int不是数组或指针,因此制作指向它的指针是没有意义的。这些类型不匹配。

答案 1 :(得分:1)

[2] int *someint = 45

不起作用,因为如果没有显式强制转换,就无法将int转换为int *。

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

45被视为int。

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

关于printf%s表示,将%s替换为char *数组,并在到达'\0'时停止

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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

因为一个整数小于一个字符串(并且适合一个内存位置),所以它通常只是在堆栈上进行delcared。

int someInt = 45;

答案 4 :(得分:1)

int *someint = 45;

与说法相同:

int *someint;
someint = 45;

这将编译警告:

initialization makes pointer from integer without a cast

如果您投射它将会在没有警告的情况下进行编译:{{1​​}}。

这是因为,您基本上是说someint = (int *)45;的“值”存储在地址45或someint,这显然不是声明​​的情况。

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

我希望这能解决问题。

答案 5 :(得分:1)

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

char *somestring = "somestring";

在这里,您声明character pointer somestring ,字符串somestring存储在内存中的某个地址,该地址分配给指针 somestring < / strong>(相信我,对于指针使用相同的名称以及它所指向的字符串的内容是令人困惑的,就像你所做的那样!)

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

现在看看,以下语句中的不同之处将产生错误:

int *someint = 45

在这里,您要声明一个整数指针someint(类型为int*),但为其指定一个整数值(类型为int)。不仅仅有{{1} }不匹配,但它可能产生不可预测的行为,因为你只是不知道地址45已经是什么。我想这就是你需要的:

type

此处<{strong>>运算符的 int num=45,*someint=&num; 地址将变量&的地址分配给指针,您可以使用num运算符取消引用它:

*

请注意 printf("The value pointed by the pointer is ",*someint); 之前的 * 在声明语句中具有不同含义以及作为someint的参数。

来到问题的第二部分,为什么我们在printf()而不是str1中使用printf(),好吧,*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