前言

我们平时使用
char str[] = "ferry";可以。
char str[10]; str = "ferry";不可以。
然鹅,还有给结构中的成员赋值的时候,可以直接用字符串初始化。这些原因都是因为开辟空间的问题。

说明

在初始化变量时,分配空间。结构也是如此。

不能将指针赋值给常量

char str1[]是array type
str1是常量,不是指针啊~
char *str2
str2是个指针(是个变量)

错误,不能给数组的地址(常量)赋值
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(int argc, char *argv[])
{
char str1[30];//已经分配好空间。
char * str2;
str2 = "ferry";
str1 = str2;//错误,str1是个地址

return 0;
}

如果我想要给str1数组添加字符咋办?那就用strcpy()复制进去

可以将数组的地址赋给指针

正确
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(int argc, char *argv[])
{
char str1[30] = "ferry";
char * str2;

str2 = str1;//字符数组的地址给指针
printf("%c", *(str2 + 1));

return 0;
}

结构的说明

*字符串在静态存储区,str[0]只不过是个地址,它指向了字符串。str[0]只是一个字符‘o’

只能以"<...>"这种字符串形式初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>

struct names
{//注意这里还没分配空间。
char first[20];
char last[20];
};

int main()
{
char * str[2] = {"ok", "ko"};
//初始化,分配空间
struct names veep = {str[0], str[1]};//Warning!!这里的str[0]存储的是个地址,不是字符串
struct names treas = {"ok", "ko"};//正确!!这里才是真正的字符串
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<string.h>
typedef struct lens {//typedef定义一种结构,名为LENS
float foclen;
float fstop;
char brand[30];//预留空间,还没分配
}LENS;

int main()
{
//对每个成员单独赋值
LENS bigeyes[10];//结构数组
bigeyes[2].foclen = 500;
bigeyes[2].fstop = 2.0;
strcpy(bigeyes[2].brand, "Remarkata");

//使用待指定初始化器
LENS smalleyes[10] = {
[2] = {
500,
2,
"Remarkatar"//这里是初始化,开始分配空间
}
};
return 0;
}