字符串及结构体纠错

①关于转义字符

#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个字节!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值