C语言知识点

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;
}










 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值