• C语言基础一


    c语言相关基础问答

    C语言中,NULL,NUL,null,三者区别?

    • NULL 空指针常量,展开后一些常见值是0、((void *)0) (0L)
    • NUL 字符名字 C语言中就是‘\0’这个字符,叫做空字符
    • null 一种东西的统称,空指针就是null pointer 空字符就是null charcater

    定义指针为0

    指向指针的指针可以为0,相当于程序吧二进制字符串当作指针
    但是,*(0) 位置在某些情况下真是一个指针。当操作系统访问该地址时,cpu会告诉操作系统该位置不能触碰,出现该内存不能read的报错。

    saferFree 会把野指针赋值为0,为了早点发现运行错误。

    总结各种指针

    • void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*类型。
    • NULL指针:是一个标准规定的宏定义;#define NULL ((void *) 0) 用来表示空指针常量;
    • 零指针:指针值为0,零值指针,没有存储任何内存地址的指针;可以使任意一种指针类型,eg:void * ;int * ;double *;
    • 空指针:指针赋值为0;0*7;3-3等之后,指针即变成空指针;即:空指针不指向任何实际的对象或者函数;NULL指针和零指针都是空指针。
    • 野指针:指向垃圾内存的指针;(1)指针变量没有初始化(2)指针被delete或者free之后没有置为空(3)指针操作超越了变量的范围
    • 悬垂指针:指向曾经存放对象的内存,但是该对象已经不存在了;delete操作完成后的指针就是悬垂指针,此时需要将指针置为0变为零值指针;

    指针的类型。
    从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
    (1)int *ptr; //指针的类型是int *
    (2)char *ptr; //指针的类型是char *
    (3)int **ptr; //指针的类型是 int **
    (4)int (ptr)[3]; //指针的类型是 int()[3]
    (5)int *(*ptr)[4]; //指针的类型是 int ()[4]
    我们可以这样理解,一个基本的数据类型(包括结构体等自定义类型)加上” * “号就构成了指针的类型。这个类型定义的变量大小是一定的,与” * “号前面的数据类型无关,” * “号前面的数据类型只是说明指针所指向的内容里存储数据的类型。

    -> 是什么意思

    ->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.

    举个栗子

    struct Data
    {
       int a,b,c;
    };              /*定义结构体*/
    struct Data * p;/*定义结构体指针*/
    struct Data A = {1,2,3};/*声明变量A*/
    int x;/*声明一个变量x*/
    p = &A ; /*让p指向A*/
    x = p->a;/*这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x*/
             /*由于此时p指向A,因而 p->a == A.a,也就是1*/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    memcpy(内存拷贝函数)

    注意:

    1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

    2.这个函数在遇到 ‘\0’ 的时候并不会停下来。

    3.如果source和destination有任何的重叠,复制的结果都是未定义的。(所以源和目的最好不要一样)

    4.VS里面memcpy超额完成了,也有memmove的功能

    举个栗子

    #include <stdio.h>
    #include <string.h>
    struct {
    	char name[40];
    	int age;
    } person, person_copy;
    int main()
    {
    	char myname[] = "Pierre de Fermat";
    	
    	memcpy(person.name, myname, strlen(myname) + 1);
    	person.age = 46;
    	
    	memcpy(&person_copy, &person, sizeof(person));
    	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Python数据分析与建模库-03数据分析处理库Pandas-1.数据读取
    Cholesterol-PEG-FITC,Fluorescein-PEG-CLS,胆固醇-聚乙二醇-荧光素水溶性
    Linux socket 字节序
    Databricks notebook里面插入图片步骤图示
    Python 小知识,wheel 文件的说明与使用
    使用VSCODE配置GO语言开发环境
    Jetpack Compose(6)——动画
    《Java》深浅拷贝解析(还不会区分深浅拷贝吗?快进来)
    R语言ggplot2可视化:使用ggpubr包的ggline函数可视化折线图(点线图、line plot)、同一水平的多个点用线连接起来
    让同一行元素垂直方向对齐的几种方法
  • 原文地址:https://blog.csdn.net/weixin_44746257/article/details/125885497