cout与printf输出变量地址时出现的问题,求解答
#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输出结果两个的值不一样? 地址输出? cout与printf?C/C++
[解决办法]
1 前面的printf函数 输出的都是字符串的地址位置, 对于数组来说 数组名ss 代表了数组的地址,&ss 也表示的是取变量的地址 也就是取数组的地址 所以 ss跟&ss是一样的
2 后面printf 里面的 a和&a 表示的是不一样的 printf a 表示一个指针变量 这个指针变量的值为ss的地址也就是&ss的值, 而&a表示的是指针变量a的地址 他们的值时不一样的
3 你看一下 你的cout语句 跟printf是一样的道理
[解决办法]
字符串是个数组,数组名可以表示数组首元素的地址,类型为指向数组首元素的指针,是指向一个元素的指针。
char ss [20];
ss == & ss[0];
&ss 表示数组 类型是定长数组指针,值为数组地址,和数组首元素地址相同。
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;