C--再看指针

指针使用流程:
C--再看指针_第1张图片
示例代码:

#include 
#include 

void func(const char * fmt, ...);

int main()
{
	char test[] = "hello";
	printf("%p\n", test);

	func("%s\n", test);

	return 0;
}

void func(const char * fmt, ...)
{
	char *p;
	p = ((char*)&fmt) + sizeof(fmt);

	printf("%p\n", *((char**)p));
	printf("%p\n", (char*)(*p));
	printf("%s\n", *((char**)p));
}

问题:

func函数中两处指针都进行了取内容和强转类型的操作,唯一的区别是操作的先后顺序不同,按我的理解这两个值应该相同,但结果却是不同!用了几年c语言感觉这指针还是没理解透。

运行结果:
C--再看指针_第2张图片
解释说明:

第一行printf:main函数中打印字符串首地址。
第二行printf:首先强转 p 类型为 char**,此时取指针 p 指向区域的内容,这个内容大小为4字节,类型为 char*
第三行printf:首先取指针 p 指向区域的内容,char* 类型的指针取内容后大小为1字节,类型为 char,接下来对 *p(char类型) 强转为指针类型,于是出现了如上图所示结果,低字节64相同,高字节不同。

你可能感兴趣的:(C语言,指针)