一些怀疑我有一个关于C.约char和INT的指针用C
[1] char *somestring = "somestring"
和
[2] int *someint = 45
为什么[1]工作和[2]不是指针问题?
为什么我们
printf("%s",str1);
,而不是
printf("%s",*str1);
?
一些怀疑我有一个关于C.约char和INT的指针用C
[1] char *somestring = "somestring"
和
[2] int *someint = 45
为什么[1]工作和[2]不是指针问题?
为什么我们
printf("%s",str1);
,而不是
printf("%s",*str1);
?
你的问题的第一部分开始,让我们看看当你使用的语句会发生什么:
char *somestring = "somestring";
在这里,你声明character pointer
somestring,字符串somestring
存储在内存的地址并且该地址被分配给指针somestring(相信我,使用相同的名称指向指针的字符串以及它所指向的字符串的内容,因为您已经完成了!)
现在你可以使用这个指针somestring
来引用那个字符串。
现在看,它是如何在下面的语句不同,这将产生错误:
int *someint = 45
这里你声明了一个整数指针someint
(的int*
类型),但分配的整数值(int
类型),以it.Not不仅有一个type
不匹配,但它可以产生不可预知的行为,因为你只是不知道什么已经是在地址45.I想这是你所需要的:
int num=45,*someint=#
这里地址&
运营商分配变量num
指针的地址,你可以取消对它的引用使用*
操作如下:
printf("The value pointed by the pointer is ",*someint);
注someint
前*如何承载不同的含义在声明声明中作为参数printf()
。
来到你的问题,为什么我们printf()
,而不是*str1
使用str1
的第二部分,以及,str1
表示字符串,这不过是数组中的第一个字符的地址的基址。因此,通过我告诉你关于*运营下去,*str1
指存储在阵列,即array.Run下面的代码的第一个字符的基地址的字符,这将是明确的:
#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
在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 *
阵列,并停止当你到达'\0'
在char *somestring = "somestring"
, “somestring” 是一个字符列表/阵列。
while int *someint = 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
的“价值”存储在地址45或0x2d
,这显然不是声明的情况。
您现在可以通过取消引用来添加值:*someint = someval;
。因此,现在someval
将存储在您之前指定的地址(尽管这可能无效,具体取决于操作系统已存储在那里)。
我希望这可以解决问题。
@Vishy为什么不呢,在GCC它编译和作品。 – stdcall 2013-05-01 08:39:36
谁谈及剥夺它? – stdcall 2013-05-01 08:53:46
在嵌入式和低级编程中,为指针分配一个常数是非常重要的。这不是误导 – stdcall 2013-05-01 09:04:36