Online Compiler C

#include <stdio.h> int main() { char str[10] = "Hello"; // 内存里:['H']['e']['l']['l']['o']['\0'] char *s = str; // s 拿到了数组第一个格子的门牌号 char c = 'X'; // c 是一个独立的普通变量,存了个 'X' printf("1. s 等于多少? 答:%p (这是一个地址,比如 0x7ffc...)\n", s); printf("2. *s 等于多少? 答:%c (因为是 s 指向的格子里的内容,即 'H')\n", *s); printf("3. c 等于多少? 答:%c (直接存的字符 'X')\n", c); printf("4. 做赋值:c = *s; \n"); c = *s; // 把 s指向格子里的 'H',复制一份给 c printf("5. 现在 c 变成了:%c (和 *s 值一样,但 c 是个独立拷贝)\n", c); // 最关键的区别来了:改 c 不影响原字符串 c = 'Z'; printf("6. 改了 c 为 'Z',但原字符串 *s 还是:%c (原数组纹丝不动)\n", *s); // 改 *s 才会影响原字符串 *s = 'Y'; printf("7. 改了 *s 为 'Y',现在原字符串变成了:%s (第一个字母变 Y了)\n", str); return 0; }
这段代码演示了C语言中指针和普通变量的核心区别。它创建了一个字符数组str,然后用指针s指向数组的第一个元素,同时定义了一个普通字符变量c。代码通过一系列操作展示了通过指针修改内容和直接修改变量的不同效果。

- 注意第6步:修改c为'Z'后,原字符串str没有变化,因为c是独立的内存空间,只是复制了*s的值。这说明了普通变量和指针指向的内容是分开存储的。

- 第7步:通过*s = 'Y'修改指针指向的内容,直接改变了数组str的第一个字符。这是因为指针s存储的是str的地址,解引用后操作的就是原数组的内存空间。