2013-05-01 83 views
2

一些怀疑我有一个关于C.约char和INT的指针用C

[1] char *somestring = "somestring" 

[2] int *someint = 45 

为什么[1]工作和[2]不是指针问题?

为什么我们

printf("%s",str1); 

,而不是

printf("%s",*str1); 

回答

1

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

char *somestring = "somestring"; 

在这里,你声明character pointersomestring,字符串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 
5

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

1
[2] int *someint = 45 

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

编辑:其实,我只是试图编译一个示例代码,它在Linux下用GCC 4.7编译,但它打印出一条警告消息。

45被视为int。

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

关于printf%s手段,代替%schar *阵列,并停止当你到达'\0'

+0

@Vishy为什么不呢,在GCC它编译和作品。 – stdcall 2013-05-01 08:39:36

+1

谁谈及剥夺它? – stdcall 2013-05-01 08:53:46

+0

在嵌入式和低级编程中,为指针分配一个常数是非常重要的。这不是误导 – stdcall 2013-05-01 09:04:36

1

char *somestring = "somestring", “somestring” 是一个字符列表/阵列。

while int *someint = 45 只是一个整数而不是列表/整数的整数。 这相当于char *somestring = 'a'这是无效的。

1

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

的替代方案将是字符存储在栈上的字符串:

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

因为一个整数比的字符串的情况下(与配合到的存储器位置)它通常只是delcared堆栈上。

int someInt = 45; 
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将存储在您之前指定的地址(尽管这可能无效,具体取决于操作系统已存储在那里)。

我希望这可以解决问题。