1、 用 函数指针 声明 一个变量时 ,需要注意:
(1)void (*fun)(long* p);//声明函数
fun dest;//此处fun是一个函数指针,是一个变量,不能用变量定义变量,所以会出错
(2)typedef void (*fun)(long *p);//此时,fun是一个函数指针类型
fun dest;//用类型定义变量当然可以啊
2、函数指针的 使用
(void(*)())0x100000 //含义: 将 0x100000强制成 一个函数指针
*( (void(*)())0x100000 ) () //含义: 通过函数指针 运行函数,即从0x100000地址处运行程序
3。 数组指针,函数指针数组,int (*a[10])(int),函数指针的调用: (*p)(a,b)
4、联合体union 计算大小,特点:变量公用空间,大小取决于最大的变量空间
5、int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param) 的函数。
6、
无符号 变量溢出: 清0
有符号溢出,正数溢出,继续自加,直到清0
7、对于#include<filename.h>编译器从标准库路径开始搜索filename.h ;对于#include “filename.h” ,编译器从用户的工作路径开始搜索filename.h 。
8、宏定义计算一个数组的大小:define NTBL(table) (sizeof(table)/sizeof(table[0]))
9、程序的局部变量存在于栈(stack) 中,全局变量存在于静态数据区中,动态申请数据存在于堆(heap)中。
10、printf(“%c”,(a)&(a-1)?’n’:’y’); // 判断是否为2的若干次幂
11、a++, 遇到;结束后或者 分号结束前 遇到下一个a++, 则值才会改变(为上一次a+1后的值)
数组: a[ 5]
a+1: 指向第二个元素
&a 和 a 等价
但是&a+1 和 a+1 不等价
数组: a++的写法,编译器会报错
12、当一个函数的参数是数组时,实际上编译器会把它当做指针去处理
13、对空指针使用free()是很危险的,且free()之后,不一定为null,成为野指针,要手动将其置null
14、字符串拼接函数:
strcat((char*)str1,(const char*)str2)
15、
C语言中 自带的 排序算法:
//冒泡排序
//两数交换不经过第三 变量
二分法查找:
链表的 创建 及 增删改查 :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define uint8_t unsigned char
#define uint16_t unsigned int
typedef struct LinkList
{
int score;
LinkList *next;
}LinkList_t;
LinkList_t* createList(int n);
void Printf_List(LinkList_t *head);
LinkList_t *AddNode(LinkList_t*head,int n);
LinkList_t *DelNode(LinkList_t *head,int n);
LinkList_t *ChangeNode(LinkList_t *head,int n);
int QueryNode(LinkList_t *head,int n);
int QueryValue(LinkList_t *head,int value);
int main(void)
{
LinkList_t *head=head=createList(5);
Printf_List(head);
AddNode(head,3);
Printf_List(head);
DelNode(head,3);
Printf_List(head);
ChangeNode(head,3);
Printf_List(head);
int node_score=QueryNode(head,3);
printf("node_scoe:%d\r\n",node_score);
int n=QueryValue(head,250);
printf("n:%d\r\n",n);
return 0;
}
LinkList_t* createList(int n)
{
LinkList_t *head= (LinkList_t *)malloc(sizeof(LinkList_t)); //头结点是不存储数据的,只存储next指针
LinkList_t *end=head;
for(int i=0;i<n;i++)
{
LinkList_t *node= (LinkList_t *)malloc(sizeof(LinkList_t));
node->score=i*20;
end->next=node;
end=node;
}
end->next=NULL;
return head;
}
void Printf_List(LinkList_t *head)
{
LinkList_t *p=head;
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->score);
}
printf("\r\n");
}
LinkList_t *AddNode(LinkList_t*head,int n)
{
LinkList_t *p=head;
for(int i=0;i<n;i++)
{
p=p->next;
}
LinkList_t *addNode=(LinkList_t*)malloc(sizeof(LinkList_t));
addNode->next=p->next;
p->next=addNode;
addNode->score=1000;
return head;
}
LinkList_t *DelNode(LinkList_t *head,int n)
{
LinkList_t *p=head;
for(int i=0;i<n;i++)
{
p=p->next;
}
LinkList_t *p_temp=p->next;
p->next=p->next->next;
p_temp=NULL;
return head;
}
LinkList_t *ChangeNode(LinkList_t *head,int n)
{
LinkList_t *p=head;
for(int i=0;i<n;i++)
{
p=p->next;
}
p->score = 250 ;
return head;
}
int QueryNode(LinkList_t *head,int n)
{
LinkList_t *p=head;
for(int i=0;i<n;i++)
{
p=p->next;
}
return p->score;
}
int QueryValue(LinkList_t *head,int value)
{
LinkList_t *p=head;
int n =0;
while( p->score != value)
{
n++;
p = p->next ;
}
return n;
}