一、
#include<stdio.h>
void main()
{
char b=0xFF;
int a=0x11223344;
int *p=&a;
*((int*)((char*)p+1))=0xAABBCCDD;
}
求a、b的值
1. int *p=&a;作用是使P指向a的首地址44,p的可访问范围为4字节
2. (char*)p的作用是将p的作用范围限定在1个字节之内,加1是将指针后移一位
3. ((int*)((char*)p+1))是将p的作用范围改为4个字节之内,所以范围为33-FF

分析过程如上图所示

所以a=0xBBCCDD44 b=0xAA
二、
void main()
{
inta=0x11223344,temp;
int*p=&a;
(char*)p=0xFF;// sizeof(p)的值依然是4
temp=sizeof(*((char*)p));//此时temp值为1
}
*指针的访问范围是任何强制转换都不能改变的,指针的访问范围只由声明时指针的类型决定
三、
void main()
{
int *p;
int k;
p=&k;
p=&k+1;//&k的类型是int *,所以&k+1的值为k的地址加上4
}
*&a+1的值与a变量的类型有关
四、
定义一个int*型数组,里面有10个元素,用一个双层整型指针指向数组首地址。要求再定义10个整型变量,将这10个变量的地址赋值给数组每个元素。赋值过程必须用双层指针结合for循环进行操作。
分析:初步一看要用for循环将10个整型变量的地址赋值给一个数组指针(这个数组里面存放的是指针),似乎是不可能的,但10个整型变量的地址是挨着的一块内存,所以用for循环是可以办到的
#include<stdio.h>
void main()
{
int * a[10];
int **p;
int x=0,m=107;//k的ASCII编码为107
int b,c,d,e,f,g,h,i,j,k;
p=a;// p指向存放指针的数组a
for(x=0;x<10;x++)
{
*p=&k+x; //&k是个int *的指针,所以加1地址就后移4
p++;
}
for(x=0;x<10;x++)
{
printf("%c的地址%d\n",m--,a[x]);
}
printf("b真正的地址%d\n",&b);
printf("k真正的地址%d\n",&k);
}
仅仅是个人理解,若有错误请指正
22:11:00 2011-12-01
浙公网安备 33010602011771号