我正在尝试学习C语言,并且无法从数据指针访问数据。
我有示例代码:
// character array for string
char mystring[] = "Hello";
// store mystring's pointer
int p = *mystring;
printf("String to pointer is %d\n":, p);
>> String to pointer is: 1819043144
// trying to access data from pointer p
printf("%s",&p);
>> H
为什么当我尝试使用&运算符从指针p访问数据时,为什么只打印“ H”?
答案 0 :(得分:3)
表达式&p
与mystring
无关。 p
是一个整数变量,而&p
是该变量的地址。
int p = *mystring;
等效于:
int p;
p = *mystring;
*mystring
是mystring
数组的第一个元素,它是字符'H'
。所以这等效于:
int p = 'H';
您的变量初始化只是复制mystring
的第一个字符并将其放入p
中。还将其从char
转换为int
。
当您尝试使用p
格式打印%s
时,会导致未定义的行为,因为%s
要求相应的参数是指向以空值结尾的字符串的指针,并且您已经为它指定了一个指向int
的指针。
将此代码与您的代码进行比较:
int *p = mystring;
printf("%s", p);
这更接近正确,因为现在p
是一个指针,并且确实指向该字符串。它不是任何东西的副本。但这仍然是不正确的,因为%s
的参数必须是char *
,而不是int *
。因此,您需要对其进行转换:
printf("%s", (char *)p);
但是最合适的方法是首先声明p
为正确的指针类型:
char *p = mystring;
printf("%s", p);