博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C 指针杂谈

Posted on 2012-12-01 22:15  flyy  阅读(201)  评论(0)    收藏  举报

一、

#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