C 值和变量的地址

C 值和变量的地址,c,pointers,C,Pointers,在打印值的地址时遇到问题: char word[] = "hi there"; //print address of string int a = 1; // print address of 1 我知道如何打印变量的地址,我认为值在变量地址内?那么值的地址实际上就是变量地址 这是一个骗人的问题,我是对的吗 提前感谢您是否尝试检查打印指针。我想这可能对你有帮助 使用规范中的%p打印地址:- p参数应是指向void的指针。指针的值为 转换为打印字符序列,以 实现定义方式 要在指针到指针中打印地址

在打印值的地址时遇到问题:

char word[] = "hi there"; //print address of string
int a = 1; // print address of 1
我知道如何打印变量的地址,我认为值在变量地址内?那么值的地址实际上就是变量地址

这是一个骗人的问题,我是对的吗


提前感谢

您是否尝试检查打印指针。我想这可能对你有帮助

使用规范中的%p打印地址:-

p参数应是指向void的指针。指针的值为 转换为打印字符序列,以 实现定义方式

要在指针到指针中打印地址,请使用以下命令:-

printf("%p",x)

在linux中,您可以使用普通gdb查看内存地址您可以使用
操作符打印变量的地址:

int a = 1; 
printf("Address of variable a is: %p",&a);
word
是一个名为char数组的对象的名称。它有地址和大小

在这个地址上,有第一个元素,一个值为
'h'
的字符。以下字母紧跟在下一个地址之后,直到最后一个
'e'
。这个后面跟一个0字节,字符串终止符。因此,数组的总大小是9:8给定字符加上0字节

+--+--+--+--+--+--+--+--+--+
|h |i |  |t |h |e |r |e |# | <-- # means NUL byte.
+--+--+--+--+--+--+--+--+--+
+--+--+--+--+--+--+--+--+--+
|68|69|20|74|68|65|72|65|00|
+--+--+--+--+--+--+--+--+--+
内存布局相同,但字符串位于只读内存中,而普通数据段包含指向该字符串的指针。所以
&wordptr
wordptr
*wordptr
是完全不同的:
&wordptr
是一个指向数据内存的
字符**
wordptr
是一个指向RO内存的
字符*
(即,指向真正的字符串,确切地说,指向字符串的第一个字符)而
*wordptr
只是开头的
'h'

奥托

a
是名为
int
的对象的名称。它还有一个地址和大小

它的大小取决于实现,也取决于内存布局。让我们使用一个字节数最小的字节进制机器,假设每个int有4个字节:

+--+--+--+--+
|01|00|00|00|
+--+--+--+--+
您可以使用
&word
&a
获取他们的地址并打印出来:

printf("%p %p\n", &word, (void *)&a);
(void*)
是必需的,因为在某些实现中,指针的大小可能不同,因此为了安全起见,我们需要强制转换指针类型。)

“地址1”这个词没有意义;虽然使用
&a
获得其地址的变量的值为1,但这仅仅是“巧合”:您可以设置
a=3
,地址保持不变,而存储在那里的值会发生变化。因此,最好说“相应地保持1的变量的地址”。

&
是生成指向其操作数指针的“地址”运算符

因此,
&a
是一个有效的指针表达式,它保存变量
a
的地址,因此可以用下面的语句打印该指针的值

printf("Address of a: %p",(void*)&a);
同样,如果希望指针指向整个
word[]
数组,可以通过以下方式打印:

printf("Pointer to Whole array: %p",(void*)&word);
如果需要
word[]
数组中第一个元素的地址,可以通过

printf("Address of first element in the word[]: %p",(void*)word);
您可能会打印并看到上面两个
printf()
语句为您提供相同的地址,但它们是不同的。阅读

注意:

如果
&
的操作数的类型为
类型
,则结果是指向
类型
指针

  • &a
    的结果是
    指向int的指针

  • &word
    的结果是
    指向9字符数组的指针。因为(*(&word))的
    大小是9

  • word
    的引用具有指向char
的类型
指针


如果您正在谈论在等号右侧打印值的地址,那么这是一个技巧性问题

等号右边的值是calld初始化器

初始化器不需要(这意味着它们是否有地址取决于编译器),在您的情况下,即使它们有地址,您也无权访问它


如果您谈论的是变量
a
word
的地址,那么这个问题就无关紧要了,因为如果您引用它,它们将有一个地址。

图片可能会有所帮助。我接受了你的声明

char word[] = "hi there";
int a = 1;
将它们放在一个简单的程序中,然后使用我编写的一个小实用程序来显示这些项目在内存中的布局。我在工作时的系统上获得以下内存映射(SLES 10,gcc 4.1.2):


注意,在这种情况下,
a
存储在低于
word
的地址,即使它在源代码中声明在word之后。不要假设变量在内存中的排列顺序与声明顺序相同

你的问题到底是什么?你可以从你的导师想要的答案开始,但“价值观”没有“地址”;它们要么位于地址(1存储在变量
a
的地址),要么位于地址(
word
是一个地址变量),因此他们的问题从一开始就用词不当。在指针变量的情况下,它们都是。@WhozCraig我的想法是一样的,我想这是一个诡计的问题。@Newbie,或者询问者也不知道这类东西。如果你想打印C标准要求的地址,在使用
%p
时通过
void*
。因此,这是少数需要强制转换(以满足标准)的情况之一。更好的做法非常有用,但是您在printf()中的键入
%a
应该是
&a
,并且您需要将case键入
void*
,至少对于int对象
a
回答得很好,特别是最后一段。@GrijeshChauhan你的意思是因为指针的大小可能是v
printf("Pointer to Whole array: %p",(void*)&word);
printf("Address of first element in the word[]: %p",(void*)word);
char word[] = "hi there";
int a = 1;
Item Address 00 01 02 03 ---- ------- -- -- -- -- "hi there" 0x400a32 'h' 'i' 20 't' 0x400a36 'h' 'e' 'r' 'e' 0x400a3a 00 '0' '1' 00 word 0x7fffb48d2ee0 'h' 'i' 20 't' 0x7fffb48d2ee4 'h' 'e' 'r' 'e' 0x7fffb48d2ee8 00 00 00 00 a 0x7fffb48d2edc 01 00 00 00 Big endian: A+0 A+1 A+2 A+3 Value: 0x12 0x34 0x56 0x78 Little endian: A+3 A+2 A+1 A+0