cout与printf输出变量地址时出现的问题,求解答

年青人阿本 2013-10-13 05:15:26
#include <iostream>
#include <stdio.h>
using namespace std;

void main()
{
char ss[]="abcd";
printf("%0x\n",ss);
cout<<&ss<<endl;
printf("%0x\n",&ss);
cout<<"---------------"<<endl;
char* a=ss;
printf("%0x\n",a);
cout<<&a<<endl;
printf("%0x\n",&a);
}
显示如下:
12ff78
0012FF78
12ff78
---------------
12ff78
0012FF74
12ff74

我想问的是:1,前面printf函数里ss与&ss值为什么是一样的?
2,为什么前面ss与&ss值是一样的,后面printf函数里a与&a又不同了?
3,为什么ss赋值给a地址,用cout输出结果两个的值不一样?
...全文
310 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
年青人阿本 2013-10-13
  • 打赏
  • 举报
回复
谢谢两位,特别是二楼,写得很详细耐心。指针本身是分配内存空间的,所以a自己有地址,应该是这样理解吧,呵呵。
lm_whales 2013-10-13
  • 打赏
  • 举报
回复
字符串是个数组,数组名可以表示数组首元素的地址,类型为指向数组首元素的指针,是指向一个元素的指针。 char ss [20]; ss == & ss[0]; &ss 表示数组 类型是定长数组指针,值为数组地址,和数组首元素地址相同。
引用 楼主 liben2007 的回复:
#include <iostream> #include <stdio.h> using namespace std; void main() { char ss[]="abcd"; printf("%0x\n",ss); cout<<&ss<<endl; printf("%0x\n",&ss); cout<<"---------------"<<endl; char* a=ss; printf("%0x\n",a); cout<<&a<<endl; printf("%0x\n",&a); } 显示如下: 12ff78 0012FF78 12ff78 --------------- 12ff78 0012FF74 12ff74 我想问的是:1,前面printf函数里ss与&ss值为什么是一样的? 2,为什么前面ss与&ss值是一样的,后面printf函数里a与&a又不同了? 3,为什么ss赋值给a地址,用cout输出结果两个的值不一样?
1)ss的值与&ss的值,这是两个不同类型的指针,指向同一位置,即数组首元素的地址。 数组地址也是从首元素算起的,所以值相同。 打个比方,简单说明一下 假设你从一条东西路,从东像西走到一个村子的村东头, 你走到村子的位置,也就是村子东头的第一户人家的位置。 这两个位置,只是含义(类型)不同,实际都是同一位置。 一个代表村子的位置 (一个村子有许多户人家) 一个代表第一户人家的位置,其他户人家位置,继续向西走才到。 因为C,C++数组,只存储数据,不存储长度信息; 所以第一个元素的位置--地址,就是整个数组的位置---地址。 因此ss的值与&ss的值,类型不同,值相同。 数组不是单一变量,是变量集合; 数组没有值,所以也不能整体赋值。 数组元素有值,即数据的值, 数组名有值,是个指针常量,指针的值,是数组首元素的地址。 数组有地址,这个地址,同时也是数组首元素的地址,不过&ss[0] 和 &ss类型不同。 2,为什么前面ss与&ss值是一样的,后面printf函数里a与&a又不同了? 变量和数组不同,变量是单一元素变量,只有一个元素,变量名表示变量的值。 变量的地址表示存储变量的位置,变量地址和变量的值,是两种不同含义的数据。 类型不同,内容也不同,不能互相代替,也没有任何通用的可能。 变量的值,储存在变量的地址,这个位置的,存储单元中。 这是变量的地址,和变量值,之间的关系。 a == *( &a );这是个恒等式。 3,为什么ss赋值给a地址,用cout输出结果两个的值不一样? ss 只能赋值给a ,不能赋值给a的地址,变量的地址,通常是个常量。不可改变。 ss 只能赋值给a的结果是: a的值,是数组ss 的首地址,是 ss[0]的地址 & ss[0]; a的地址,在函数的一次调用中,是不会改变的。 外部变量,和局部静态变量的地址永远不会改变。 函数作用域内的变量,寄存器变量,不存在地址之说; 自动变量,在每次函数调用中,都是不同的变量; 虽然变量名,和定义变量的代码都相同。 但是地址不一定相同,多半都不相同。 他们不是同一个变量。 测试代码 #include<stdio.h> void test1(){ int a=1,b=10; printf("test1 自动变量测试\n"); printf("a的地址是 %p,a 的值是 %d",&a,a); printf("b的地址是 %p,b 的值是 %d",&b,b); } void test(){ int x=7,y=9; printf("test 自动变量测试\n"); printf("x的地址是 %p,x 的值是 %d\n",&x,x); printf("y的地址是 %p,y 的值是 %d\n",&y,y); printf("test() 函数调用 test1()\n"); test1(); } int main(){ printf("main 函数调用 test1()\n"); test1(); test(); getchar(); return 0; } PS:C,C++ printf("%p",&a);可以输出变量的地址,&a 换成指针,输出指针的值。 C++ : cout<< &a; 输出字符地址之外,其它类型数据的地址,换成指针,输出指针的值。 如果 a 使个字符 &a 被当作字符串输出。 对于指针 p cout<<p ;输出指针的值,如果这个指针,不是字符指针的话,否则输出字符串。 对于指针,变量地址 prinf("%p",p);printf("%p",&a); 效果更好,更干脆,更简单。 cout 输出字符指针的值,字符的地址要强制转换才行。 cout<<(void *)p;cout<<(void *)&a;
kander 2013-10-13
  • 打赏
  • 举报
回复
1 前面的printf函数 输出的都是字符串的地址位置, 对于数组来说 数组名ss 代表了数组的地址,&ss 也表示的是取变量的地址 也就是取数组的地址 所以 ss跟&ss是一样的 2 后面printf 里面的 a和&a 表示的是不一样的 printf a 表示一个指针变量 这个指针变量的值为ss的地址也就是&ss的值, 而&a表示的是指针变量a的地址 他们的值时不一样的 3 你看一下 你的cout语句 跟printf是一样的道理

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧