测试代码:
#include "stm32f10x.h" // Device header
#include "Serial.h"
char *s1;
char s2[6];
char * fun(){
s1 = "hello";
char s2[] = "hello";
printf("Address of s1 (pointer): %p\n", (void*)s1); // 打印s1指向的地址
printf("Address of s1: %p\n", (void*)&s1); // 打印s1本身的地址
printf("Address of s2 (array): %p\n", (void*)s2); // 打印s2数组的地址
printf("*s1=%X\n",*s1); // 打印s1指向的内容
return s1;
}
int main(){
Serial_Init();
printf("Address of s1 (pointer): %p\n", (void*)s1);// 打印s1指向的地址
printf("Address of s1: %p\n", (void*)&s1); // 打印s1本身的地址
printf("Address of s2 (array): %p\n", (void*)s2); // 打印s2数组的地址
char * h = fun();
printf("Address of s1 (pointer): %p\n", (void*)s1);// 打印s1指向的地址
printf("Address of s1: %p\n", (void*)&s1); // 打印s1本身的地址
printf("Address of s2 (array): %p\n", (void*)s2); // 打印s2数组的地址
printf("*s1=%X\n",*s1); // 打印s1指向的内容
while (1) {
// 保持单片机运行
}
}
输出结果:
理解:
1)如果指针指向一个字符串字面量(例如 char *s1 = “hello”;),则该指针在程序的整个生命周期内都有效,都指向这个字符串。
2)如果指针指向函数内部定义的局部数组(例如 char s2[] = “hello”;),则这种指针的有效性仅限于该函数的作用域。(自己理解,不一定对:"hello"被复制到栈上,s2指向数组首地址)
总结:指针s1指向的量是恒定不变(保存在flash的Rodata区),所以一直有效;s2[ ]是保存在栈上的,函数结束就释放了内存,s2这个头指针也就无效了。换句话,指针的有效性取决于指针所指向的内存区域及其生命周期。