先看一个 数组定义字符串
#include<stdio.h>
int main()
{
char s3[]="Hello World";
char* s;
s=s3;
printf("s3:0x%p\n",s3);
printf("s:0x%p\n",s);
s3[0]='B';
printf("%c\n",s3[0]);
printf("%s\n",s3);
printf("%s\n",s);
printf("%d\n",sizeof(s3));
}
结果为
s3:0x000000000000062FE00
s:0X000000000000062FE00
B
Bello World
Bello World
12
//%p是输出指针的地址,因为指向一样,所以地址一样
用数组定义字符串,字符串可写,这时s3[0]=‘B’,结果可以改变就叫做字符串可写。part1里的字符串不能改变,s3[0]='B’语句没有作用。
这里用数组定义字符串后,再用指针指向这个字符串,和part1相比,地址复杂了许多,说明这个地址不是临时地址了。
计算字符串长度12,Hello World+\0,\0也占有字符串的一位,但是不会显示出来。
那我要说的是第二种
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char *p;
P=(char *)malloc(sizeof(char)*20);
strcpy(p,"hello");
printf("%s sizeof(p)=%zd\n",p,sizeof(p));
free(p);
return 0;
}
用了strcpy函数,思维很巧妙。
这里结果为8和输出途径为zd,这里我进行了查询,zd为输出指针大小的。
因为*p代表的结构体,int占用了4个字节,char1个字节,short是2个字节,所以是7个,但是根据自己对齐原理,必须是4的倍数所以补齐一个,变成8个
这里有个博主写的c语言如何使用指针 指向字符串,列举的例子都很棒,下面附上链接
end