①关于转义字符
#include <stdio.h>
int main()
{
char *s="\ta\018bc";
for(;*s!='\0';s++)
{
printf("*");
}
return 0;
}
这里for循环的次数是6;\t,a,\01,8,b,c ,一共循环了6从=次,\t制表符,\01是'转义字符,\018不是八进制!!!八进制不能超过7,格式为\o,\oo或\ooo;
②字符串和指针的概念没掌握好
#include <stdio.h>
int main()
{
char s[]="china";
char *p;
p=s;
return 0;
}
A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等
C)s数组长度和p所指向的字符串长度相等 D)﹡p与s[0]相等
分析:A:p指向字符串首地址,s是数组名,里面是字符串;这两个不同,一个是地址一个是字符串数组;
B:p指向的是数组s的首地址,跟s数组的内容不同,不是一个概念;
C:s数组长度为6,s是数组,计算到’\0’位置并包括’\0,所以是5+1=6;p所指向的字符串长度为5,strlen求字符串长度不包括\0;
D:*p=‘ c ',s[ 0 ]=' c ',正确;
③数组长度有\0
int main()
{
char a[]="It is mine";
char *p="It is mine";
return 0;
}
A: a+1表示的是字符t的地址
B: p指向另外的字符串时,字符串的长度不受限制
C: p变量中存放的地址值可以改变
D: a中只能存放10个字符
分析:这个题和上面第二题一样,数组长度是要算\0的,字符串长度的计算不需要\0;
④关于strcpy函数
函数声明char *strcpy( char *to, const char *from );第一个参数是接受拷贝的字符串,第二个参数是被拷贝的字符串,原型加了const是因为在这里不希望拷贝来源的字符串被修改。一定要清楚参数的位置,如下面这道题:
#include<stdio.h>
#include<string.h>
int main()
{
char *p1,*p2,str[50]="ABCDEFG";
p1="abcd";
p2="efgh";
strcpy(str+1,p2+1);//Afgh
strcpy(str+3,p1+3);//Afgd
printf("%s",str);
return 0;
}
char str[]="welcome";
printf("%d\n",strlen(strcpy(str,"hello")));
也是strcpy函数,结果为5
⑤字符串函数头文件是<string.h>,字符函数头文件是<ctype.h>。
⑥char s[20]="progrmming",char *ps=s;ps+2此时表达的是地址,并不是字符' o '。
结构体变量成员的引用和结构体类型指针变量的引用
结构体变量成员的引用
struct student
{
char name[20];
char sex;
int age;
float score;
}stu={"Wang Hong",'F',20,90.0};
stu.name是取成员name数组的首地址
&stu.name是取成员name数组第i个元素的地址
&stu.score是取成员score的地址
&stu.score是取成员score的值
结构体类型指针变量的引用
struct student
{
char name[20];
char sex;
int age;
float score;
}stu={"Wang Hong",'F',20,90.0};
struct student *pstu=&stu;
注意这里的指针pstu只能指向此类型的结构体类型变量,而不是指向结构体类型变量中的某一个成员。比如
pstu=stu.name;这个是错误的表达,stu.name是char类型,pstu是地址。如果要这样表达只能通过强制类型转换使得他们转换成同类型。
pstu=(struct student *)stu.name;
两种引用方法:
(1)利用指向运算符" -> "来引用结构体类型变量的成员:
pstu->name;pstu->age;pstu->score;
(2)利用成员运算符" . " 来引用结构体类型变量的成员,格式为(*结构体类型指针变量).成员们。
(*pstu).name;(*pstu).age;(*pstu).score;
注意,(*pstu)两侧括号不可少,因为成员符" . "的优先级高于" * "。
通过以上的总结分析一下这个题:B选项std.name不用取地址,std.name本身就是个数组,scanf不用加&。
分析:A:p=&a,p只能指向结构体类型变量。B的正确表达应该是p=&data.a,得加&取地址符。D选项data.a是成员的值,*p是取结构体变量的值,不可以赋值。
分析:A:std是结构体变量,结构体变量引用成员用std.age。B:表达错误,这里可以表达为:p->age,或(*p).age。C:去掉括号就等效于*(p.age),成员符" . "的优先级高于” * “。
关于结构体和公用体内存开辟和字节对齐
如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.
union的空间为8个字节,画个图:
那么struct的空间就是40个字节:先找字节开辟最大的是union aa为8个字节,float w[ 5 ]为4*5=20,20补4个字节就是8的整数倍,后面的double类型也是8个字节。所以就是5*8=40个字节!