求助:一个关于指针变量a的&a的运用
今天刚看了第六课的视频,有这么一个程序main()
{
void *a;
a=(void *)malloc(4);
scanf("%d %d",(int *)a,(int *)a+1);
printf("%d",*((int *)a) + *((int *)a+1));
}
老大刚开始打成了(int *)&a
a是开出的4个空间的首地址,而&a应该是指针变量a的地址,即&a这个地址里放的是4个空间的首地址,也就是说也可以用指针的4个字节的空间
main()
{
void *a;
a=(void *)malloc(4);
scanf("%d %d",(int *)&a,(int *)&a+1);
printf("%d",*((int *)&a) + *((int *)&a+1));
}
第二段代码是把两个输入存放在了指针变量的4个空间里了,而不是指针变量所指的动态开出来的4个空间里
可对前面课程的一个程序
#define H strlen(a)
main()
{
char *a="ChinaPYG!";
int*b=0;
for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
printf("%c",*(a + *((char *)&b+1)));
}
其中的&b同样应该是指针b的4个空间
这里假设段地址也为1000
即*((char *)&b+1)应该是2001里的内容 3(实际情况可能不同,但不一定是0)
当是3时,输出的字符是从*(a+3)开始的
可实际情况是程序输出正确,但我去掉所有的&时,总是从第2个字符开始输出,而我认理解为(char *)b才是0所在空间的第一个空间
不知道我哪里理解错了,请老大和各位纠正一下! 我的看法是 *a本来就是被定义为指针的。
main()
{
void *a;//这里我的理解是 定义一个Void型的指针 *a
a=(void *)malloc(4);// 这里为a申请四个字节的空间
scanf("%d %d",(int *)a,(int *)a+1); //前俩字节一组,后俩一组
printf("%d",*((int *)a) + *((int *)a+1));// 后面的就是分别取内容打印之
}
附注:(int *) 说明后边的变量/空间 存放的数据类型是 指针型的 就是存的是地址
[ 本帖最后由 kelvar 于 2009-5-13 23:26 编辑 ] 前边解释的是完全OK的 这个程序我没看懂问的是什么
#define H strlen(a)
main()
{
char *a="ChinaPYG!";
int*b=0;
for( ; *((char *)&b+1) < H ; (*((char *)&b+1))++)
printf("%c",*(a + *((char *)&b+1)));
}
int * b 本身在内存开辟了四个空间 我们用 &b 取这个空间的地址后 这四个字节就归我们处理了 (char *)&b 就表示 &b 这个地址指向的是一个字节的内存空间 (char *)&b+1 就是指向第二个char 型数据空间的地址 * 一下 就是该内存的数据了
a是开出的4个空间的首地址,而&a应该是指针变量a的地址
这个之所以 我讲 &a 修改为了 a
用&a 是将存储的数据放到了 a 这个变量里
不用&的时候 是将变量存放到了我们动态开辟的空间里 我也是菜鸟。冒昧回答下。感觉楼主的理解有些问题。
一、
int*b=0;按楼主所画,2000,2001肯定为0(而不是你说的“不一定”)。
*((char *)&b+1)代表地址2001对应的变量,初始值为0。
二、但我去掉所有的&时,总是从第2个字符开始输出,
去掉所有的&时,b=0,*((char *)b+1)就不成立了。内存会报错的。 我的理解是,
int*b=0;
这句开了两处空间,一处是0所占的两个字节的空间,即1000和1001;
另一处是指针b所占的四个字节的空间,即2000~2003;
而指针b指向的是0所在的空间,即b里放的是0的地址;
如果是这样的话,2002和2003为0所在空间的段地址,2000和2001为段内偏移地址,而0的地址不可能为00 00 00 00(H)吧
在这样的情况下,同上楼说的一样,*((char *)&b+1)为2001的内容,但2001里是0的地址,怎么可能一定是00H呢? int*b=0;
这句开了两处空间,一处是0所占的两个字节的空间,即1000和1001;
另一处是指针b所占的四个字节的空间,即2000~2003;
这里错了 你这样来看 int b; b=0;就看明白了
int*b=0; 声明了一个变量 这个变量占四个空间 往这个变量的前两个字节赋值为0 (后两个字节为段地址 我们之后再讲) 前面理解的没问题,后面的2000和2001地址里面肯定是0的(如果small模式的话),所以一定是0. 明白了/:018 多个指针 ,可以按 从里到外层层剥离 变量 = 变量名 + 地址
指针指向变量的地址,char型除外,,呵呵
页:
[1]
2