[英]Character Pointer in C
专家我对此计划有些怀疑。
#include<stdio.h>
void main() {
char str1[] = "Hello";
char * p = "Hello", * s, * q;
p = "Bye";
printf("%s", p);
s = p;
printf("%s", s);
q = str1;
printf("\n%s", q);
}
这里的p,s和q是字符指针。 众所周知,指针存储变量的地址,并假设如果我们使用p = str1,则它应该存储数组str1的基地址。 那么在这里p如何像存储字符串的数组一样工作? 我还不太了解什么是字符指针。 真的不是指针吗? 因为我们没有使用&,我们也没有获得地址作为输出。 请帮忙。 谢谢。
您在这里非常正确:
众所周知,指针存储变量的地址,并假设如果我们使用p = str1,则它应该存储数组str1的基地址。
您的第一个问题:
那么在这里p如何像存储字符串的数组一样工作?
您可以说p
的行为就像一个数组,但实际上,它只是一个指针,它指向字符串str1
的基地址,该字符串是一个以空字符结尾的字符串。
您的第二个问题:
我还不太了解什么是字符指针。 真的不是指针吗?
字符指针还是类似于C中其他类型的指针的指针。
但是这里有个陷阱。 当您这样做时:
char a = 'A';
char *ptr = &a; // ptr points to character 'A'
这里的ptr
是指向字符的指针 。
但是当您这样做时:
char *str = "Hello";
char *ptr = str; // ptr points to first character of string str
这里ptr
是指向字符串的指针
这里要注意的一点是-指向字符的指针与指向字符串的指针不同。
在C语言中,字符串定义为字符数组。 字符数组和字符串之间的区别是字符串以特殊字符'\\ 0'终止。 所以,
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char str[] = "Hello";
两者相同,但是初始化方式有所不同。
无论在程序中的何处,我们都使用str
,这将给出字符串“ Hello”的基地址。 同样,字符串文字也是字符数组,但不能更改,因为编译器可能会将它们放在只读数据段中。
所以,如果我们有char *ptr = str
ptr[0] == str[0]
ptr[1] == str[1]
.....
..... and so on
因为,
ptr[0]
是*(ptr + 0)
,它是字符串str
第0个位置的字符,也可以写为*ptr
和
ptr[1]
是*(ptr + 1)
,它是字符串str
的第一位置的字符。
当我们增加一个指针时,它会以该指针指向的对象大小的步长递增。 在这里,ptr是指向char
指针,因此, ptr+1
将给出下一个字符的地址,而*(ptr + 1)
给出该位置的字符。 这就是为什么对于用户而言,它看起来像一个数组。
您的第三个问题:
因为我们没有使用&,我们也没有获得地址作为输出。
如果我正确获取它,则要打印字符串的基地址,指针指向该地址。
为了获得字符串的基地址,指针指向您需要使用%p
。 像这样:
#include<stdio.h>
int main() {
char str1[] = "Hello";
char * ptr = str1;
printf ("%s\n", str1);
printf ("%s\n", ptr);
printf ("%p\n", ptr);
printf ("%p\n", str1);
printf ("%p\n", &str1[0]);
return 0;
}
我的系统上的输出:
Hello
Hello
0x7fff5e997b46
0x7fff5e997b46
0x7fff5e997b46
在这里,您可以看到ptr
, str
和&str[0]
给出了相同的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.