首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C指针格式化有关问题

2012-04-10 
C指针格式化问题写了一个可变参数的函数 过程中遇到了一个不解的问题 高手们帮忙解答:char *last sd

C指针格式化问题
写了一个可变参数的函数 过程中遇到了一个不解的问题 高手们帮忙解答:

char *last = "sd"; // 可变参的固定参数 下面的语句用来获得固定参数后的 可变参地址
char *ap = (char *)&last + sizeof(last);
char *ap = (char *)(&last + sizeof(last)); //这两句话得出的 ap地址完全不同呀

有什么不同呢? 都是取地址然后转换为 char* 形式呀??
还有就是 如果给指针直接赋地址 char * ap = 0x12345678 行么? 就是说 为什么要把地址做一下格式转换呢?
各位大大解答一下 ....


// -------------------------------------------- 完整的程序
#include <stdio.h>

#define arg_start(ap, last) (ap = (char *)&last + sizeof(last))
//#define arg_start(ap, last) (ap = (char *)(&last + sizeof(last)))

#define arg_get(ap, type) *((type *)((ap += sizeof(type)) - sizeof(type)))
#define arg_end(ap) (ap = NULL)

void myprint(char *s, ...)
{
  char *ap = arg_start(ap, s); //获得第一个可变参数的地址
  char c = *s; //取固定参数

  while (c) 
  {  
  if (c == 's')
  printf("s == %s \n", ((char*)arg_get(ap, char*))); // 打印可变参 
   
  if (c == 'd')
  printf("d == %d \n", ((int)arg_get(ap, int))); // 打印可变参 
   
  s++;
  c = *s; 
  }  
  arg_end(ap);
}
int main(void)
{
  myprint("ds\0", 888, "hello world\0");
  return 0;
}


[解决办法]
这两句的效果是完全不同的:假定p为一指针,则p+n实际上是p指向的地址+sizeof(*p)*n.
char *ap = (char *)&last + sizeof(last);
这句是正常的:last指向的地址+4
char *ap = (char *)(&last + sizeof(last)); 
last指向的地址+16
[解决办法]

探讨
这两句的效果是完全不同的:假定p为一指针,则p+n实际上是p指向的地址+sizeof(*p)*n.
char *ap = (char *)&amp;last + sizeof(last);
这句是正常的:last指向的地址+4
char *ap = (char *)(&amp;last + sizeof(last));
last指向的地址+16

[解决办法]
其实,地址就是一个32位数值(32位CPU)
int a=1;
int *p=&a;
如果a的地址是0x12345678,那么p的值也就是0x12345678
既然地址可以是像0x12345678这样的数值,那么肯定可以这样赋值:char *p=0x12345678

int a=1;
int *p=&a;
都知道p+1的实际值为p+4*1,为什么是4*1呢?不是1*1?那是因为我们已经知道p是一个整形指针,一个整形占4个字节,p+1指向下一个整形数值,所以要*4.所以p的最后值为0x1234567c
如果我们不知道0x12345678是一个什么类型的指针(也就是不知道它指向什么类型的数据),我们只知道0x12345678+1指向下一个数(不知道这个数是什么类型),那么就不知道0x12345678+1的最后结果是多少了
[解决办法]
探讨
引用:

这两句的效果是完全不同的:假定p为一指针,则p+n实际上是p指向的地址+sizeof(*p)*n.
char *ap = (char *)&amp;amp;last + sizeof(last);
这句是正常的:last指向的地址+4
char *ap = (char *)(&amp;amp;last + sizeof(last));
last指……

热点排行