最近发现看代码变得有点问题了,想来想去还是这个工具,对C语言的一些内容的忘记和之前就没搞懂的部分存在的问题
首先就是“解引用”这个词的意思,之前一直没怎么注意过这个词的真正意思,今天查阅了才真正搞懂:首先在指针里有两个 *** 作符一个&,一个*,&很简单就是取地址的意思;而*解引用这个词是有丝丝晦涩,其实一句话就是返回内存地址保存的值。
接下来就是结构体:结构体本身就是一种自定义的数据类型,它和int啊什么的差不多,所以创建结构体不占内存,只有结构体变量才分配空间。
结构体初始化变量可以定义完再初始化,也可以定义的时候就给变量初始化,但结构体数组就比较特别,必须在定义的时候就初始化,如果先定义再赋初值是错误的
结构体的存储:
1.结构体的整体空间是占用空间最大的成员所占字节数的整数倍
2.结构体的每个成员相对结构体首地址的偏移量都是最大基本类型成员字节大小的整数倍,如果不是,编译器会自动补齐
//偏移量:是结构体变量中成员的地址和结构体变量首地址的差。即便宜字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0
结构体与指针:
用结构体指针变量访问结构体变量成员,以下三种形式是等价的:
p->cName//可进行正常运算==(*p).cName==student.cName
C语言中的链表:
创建链表:
一般创建链表我们都用typedef struct,因为这样定义结构体变量时,我们可以直接使用变量名了
typedef struct student{
int score;
struct student *next;
} LinkList;
LinkList *creat(int n){
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空链表则头尾节点一样
for (int i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->score);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}
修改链表节点值:分为修改链表头节点值,和修改头结点以外的结点值
//修改头结点值
struct Test *point = head;
if(point->data == data1)
{//这里一进来先判断一下是否要修改的是头结点
point->data = data2;
return point;
}
//修改除头结点以外的结点值
while(point != NULL)
{
if(point->data == data1)
{
point->data = data2;
}
point = point->next;
}
位运算:
十进制转二进制的思路;
把一个十进制数字除以2得到商和余数,记录余数,然后在把商除以2再得到商和余数,依次记录余数,直到商为0的时候停止计算,最后把所有的记录的余数排在一起再反过来就好了。
例如123这个数:
123/2=61……1 61/2=30……1 30/2=15……0 15/2=7……1 7/2=3……1 3/2=1……1 1/2=0……1 得到的1101111
再倒过来就是真正的二进制数为1111011
二进制转十进制把运算过程倒过来就好了。
位 *** 作之对齐特性:
对齐是指如何安排对象在内存中的位置。
_Aliganas运算符给出了一个类型的对齐要求,在_Aligo关键字后面的圆括号里加上类型名即可
位字段:
位字段是C语言中一种存储结构,不同与一般存储结构的是,它在定义成员的时候要指定成员所占的位数,位字段是一个sighed int 和unsighed int中一组相邻的位,位字段通过一个结构体声明来建立,该结构体声明为每一个字段提供标签,和每个字段的宽度
//建立一个四个1位的字段
struct {
unsigned autfd : 1;
unsigned bldfc : 1;
unsigned undln : 1;
unsigned itals : 1;
} prnt;
通过prnt可以设置和访问某些bit位的值,带有位字段的结构提供了一种记录设置的方便途径。许多设置(如,字体的粗体或斜体)就是简单的二进制一。例如,开或关、真或假。如果只需要使用1位,就不需要使用整个变量。内含位字段的结构允许在一个存储单元中存储多个设置。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)