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
[解决办法]
[解决办法]
其实,地址就是一个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的最后结果是多少了
[解决办法]