[英]A few doubts about char and int pointers in C
我对C中的指针有疑问。
[1] char *somestring = "somestring"
和
[2] int *someint = 45
为什么[1]有效,[2]没有?
为什么我们
printf("%s",str1);
并不是
printf("%s",*str1);
?
在C中,一个文字字符串基本上是一个(只读)字符数组,所以char *(是的,它应该是const char *,但是它会丢失到历史记录中)。 文字int不是数组或指针,因此制作指向它的指针是没有意义的。 类型不匹配。
[2] int *someint = 45
不起作用,因为如果没有显式强制转换,您无法将int转换为int *。
编辑:实际上,我只是尝试编译一个示例代码,它在Linux下编译GCC 4.7,但它打印出一条警告消息。
45被认为是int。
[2] int *someint = (int *) 45
关于printf
, %s
表示用%s
char *
数组替换%s
,到达'\\0'
时停止
在char *somestring = "somestring"
,“somestring”是列表/字符数组。
而在int *someint = 45
45只是一个整数而不是整数列表/数组。 它相当于char *somestring = 'a'
无效。
当您声明一个字符串文字,例如"somestring"
,编译器会在编译时知道这一点并将其放入程序的单独内存部分。 然后,编译器将此位置的内存地址分配给字符串指针。
另一种方法是将字符串中的字符存储在堆栈中:
char someString[] = { 's', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0 };
因为整数小于字符串(并且适合内存位置),所以通常只是在堆栈上进行delcared。
int someInt = 45;
int *someint = 45;
和说:
int *someint;
someint = 45;
这将编译警告:
initialization makes pointer from integer without a cast
并且如果你someint = (int *)45;
它将在没有警告的情况下编译: someint = (int *)45;
。
这是因为,你基本上是说someint
的“值”存储在地址45或0x2d
,这显然不是声明的情况。
您现在可以通过解除引用来添加值: *someint = someval;
。 因此,现在someval
将存储在您之前指定的地址中(尽管这可能不起作用,具体取决于操作系统已存储的位置)。
我希望这可以解决问题。
从问题的第一部分开始,让我们看看使用语句时会发生什么:
char *somestring = "somestring";
在这里,你声明一个character pointer
somestring ,字符串somestring
存储在内存中的某个地址,并且该地址被分配给指针somestring (相信我,令人困惑的是使用相同的名称作为指针和字符串的内容吧指出,正如你所做的那样!)
现在,您可以使用此指针somestring
引用该字符串。
现在看看,以下语句中的不同之处将产生错误:
int *someint = 45
在这里,你声明一个整数指针someint
(类型为int*
),但为它指定一个整数值(类型为int
)。不仅存在type
不匹配,但它会产生不可预测的行为,因为你只是不知道已经是什么在地址45.我想这就是你需要的:
int num=45,*someint=#
在这里, &
运营商的地址赋给变量的地址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
but *str1 is : D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.