我对 C 中的指针有疑问。
[1] char *somestring = "somestring"
和
[2] int *someint = 45
为什么 [1] 有效而 [2] 无效?
为什么我们要
printf("%s",str1);
并不是
printf("%s",*str1);
?
我对 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 被认为是一个整数。
[2] int *someint = (int *) 45
关于printf
,%s
意味着,%s
用char *
数组替换, 当你到达时停止'\0'
在char *somestring = "somestring"
中,“somestring”是字符列表/数组。
而在int *someint = 45
45中只是一个整数,而不是整数列表/数组。它等效于char *somestring = 'a'
which 无效。
例如,当您声明一个字符串文字"somestring"
时,编译器在编译时就知道这一点,并将其放入程序中单独的内存部分。然后编译器将此位置的内存地址分配给您的字符串指针。
另一种方法是将字符串的字符存储在堆栈上:
char someString[] = { 's', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0 };
因为整数小于字符串(并且适合内存位置),所以它通常只是在堆栈中删除。
int someInt = 45;
int *someint = 45;
和说的一样:
int *someint;
someint = 45;
这将与警告一起编译:
initialization makes pointer from integer without a cast
如果你转换它,它将在没有警告的情况下编译: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.I假设这是您需要的:
int num=45,*someint=#
这里运算符的&
地址将变量的地址分配给num
指针,您可以使用*
运算符取消引用它,如下所示:
printf("The value pointed by the pointer is ",*someint);
注意* beforesomeint
在声明语句中和作为printf()
.
来到你问题的第二部分,为什么我们使用str1
inprintf()
而不是*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