user-0 提问: 请教用printf显示地址。

回复:
user: user-1
content: 你这是学指针吧，但语法你还没记好

user: user-2
content: 数组结束地址由 数组长度，类型长度 决定 char 长度一般是一个字节 char [N] 就是N个字节 地址本身，只表示位置 但是C,C++ 表示地址的数据，其实是指针，是有类型的指针 这个类型的长度，表示下一个同类型数据，最近可以存放在哪里（距离为0时候）。 这也是指针加减法的单位长度 ++ 增加一个单位长度 ， +=n ,增加 n个单位长度 注意 void 类型长度为0 ; void* 指针，无法计算长度（其实是0）， 虽然是通用类型的指针，但是指针算术运算，却不能进行。 PS: 字符串结束符，不是数组结束符。仅仅表示这一串字符到此结束。 数组通常比这长些. 二者至少是相等的， 串长不会长过数组长度除非越界（出错了）

user: user-2
content: 对于C++ char 类型数组，或者指针 用cout<<str ;这种方式输出的是字符串 对于非字符类型数组 输出的是数组的（首元素）地址  C++ 数组，和C数组基本一致，除了输出

user: user-2
content: 以上，都说针对C的 基本上是针对 printf 系列函数的

user: user-2
content: 数组名 str加上取址运算符&， 表示取str 这个N元素的数组的地址  该地址代表整个数组  数组名，单独出现在表达式中， (除了有限的结个例外)  往往解析为数组首元素的地址， 这个地址和数组地址值是相同的，  只是类型不同 一个是 字符地址。 一个是字符数组地址。  输出地址用 %p 输出字符串 用 %s  输出数组，只能循环了，没有直接输出的方法 输出结果，也是自行定义

user: user-3
content: 引用 16 楼 qq_16774199 的回复:[quote=引用 14 楼 zhao4zhong1 的回复:] 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 但是没有书从你说的角度去教初学者啊，而初学者能把printf学清楚也不容易了。 您说的反汇编入手，对初学都好像更难，实际上我连反汇编窗口是哪个，从哪里点出来都不清楚，更别说看懂。[/quote] http://edu.csdn.net/course/detail/2344

user: user-0
content: 引用 14 楼 zhao4zhong1 的回复:不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 但是没有书从你说的角度去教初学者啊，而初学者能把printf学清楚也不容易了。 您说的反汇编入手，对初学都好像更难，实际上我连反汇编窗口是哪个，从哪里点出来都不清楚，更别说看懂。

user: user-0
content: 引用 13 楼 qq423399099 的回复:[quote=引用 12楼我是你的主体 的回复:][quote=引用 11 楼 qq423399099 的回复:] 对的，会自动帮你加上'\0'(注意不是'0'自己注意区分）  谢谢。 进一步说0012ff43就是字母S的地址啦？ 若把0012ff43放到一个名叫ABC的变量里，于是ABC就成为指针变量。 凭着ABC指针变量去内存里就能找到str1字符串开始的位置，然后开始读取，读到\0结束，于是读出str1字符串变量的内容？ 是不是这样子？[/quote]对[/quote] 以上都是我想当然的推测，这真的就是针指的真实面目吗？

user: user-3
content: 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

user: user-4
content: 引用 12楼我是你的主体 的回复:[quote=引用 11 楼 qq423399099 的回复:] 对的，会自动帮你加上'\0'(注意不是'0'自己注意区分）  谢谢。 进一步说0012ff43就是字母S的地址啦？ 若把0012ff43放到一个名叫ABC的变量里，于是ABC就成为指针变量。 凭着ABC指针变量去内存里就能找到str1字符串开始的位置，然后开始读取，读到\0结束，于是读出str1字符串变量的内容？ 是不是这样子？[/quote]对

user: user-0
content: 引用 11 楼 qq423399099 的回复:对的，会自动帮你加上'\0'(注意不是'0'自己注意区分）  谢谢。 进一步说0012ff43就是字母S的地址啦？ 若把0012ff43放到一个名叫ABC的变量里，于是ABC就成为指针变量。 凭着ABC指针变量去内存里就能找到str1字符串开始的位置，然后开始读取，读到\0结束，于是读出str1字符串变量的内容？ 是不是这样子？

user: user-4
content: 对的，会自动帮你加上'\0'(注意不是'0'自己注意区分）

user: user-0
content: 引用 9 楼 qq423399099 的回复:字符串读取到'\0'就会自动结束读取  那么情况就变成这样：

user: user-4
content: 字符串读取到'\0'就会自动结束读取

user: user-0
content: 引用 5 楼 lm_whales 的回复:数组名 str加上取址运算符&， 表示取str 这个N元素的数组的地址  该地址代表整个数组  数组名，单独出现在表达式中， (除了有限的结个例外)  往往解析为数组首元素的地址， 这个地址和数组地址值是相同的，  只是类型不同 一个是 字符地址。 一个是字符数组地址。  输出地址用 %p 输出字符串 用 %s  输出数组，只能循环了，没有直接输出的方法 输出结果，也是自行定义  你好，我做个图，希望能帮助理解，请看看是否正确。 0012ff43是字母s在内存中的地址，也是字符串开始的位置，对吧？ 如果只是开始地址，那结束地址谁记录？不记录那读取过头了怎么办？

user: user-5
content: 数组名代表数组的地址，它不是指针，是符号地址常量，在内存中没有给它分配空间。所以对它取地址应该是不合法的。但一般对它取地址后得到的值就是它本身代表的值，即数组的地址。 1、输出的是int类型，是十进制。 2、开始地址。 3、可以。 4、如果你说的是&str1的话，它不是指针。 指针变量储存的是地址，它本身也有内存空间，也有自己的地址。

user: user-6
content: 数组名本来就是一个地址了吧？为什么还要取值符号呢？我也不是很懂

user: user-7
content: char str1[]="silenthunter"; 	int add=str1;     printf("%s\n%s\n",str1,(int *)add); 	return 0; 自己琢磨一下.

user: user-8
content: %d输出的是int，使用%p输出指针