首页 > 其他分享 >C语言指针(3)

C语言指针(3)

时间:2024-08-14 08:56:19浏览次数:14  
标签:函数 常量 void C语言 内存 指针 size

野指针与空指针:

野指针:

概念:访问一个已经销毁或者访问受限的内存区域外的指针

产生场景:·变量未初始化,通过指针访问该变量

    

                

          ·指针变量未初始化          

               

          ·指针指向的内存空间被(free函数)回收了、

          ·指针函数在直接返回局部变量的地址

          ·指针指向数组以外的地址(小标越界)

如何避免野指针:·写代码要养成4个习惯(通过编码规范避免)

  1. 指针变量要及时初始化,如果暂时没有对应的值,建议赋值为NULL
  2. 数组操作(遍历、指针运算)时,注意数组长度,避免越界
  3. 指针指向的内存空间被回收,建议给这个指针变量赋值为NULL
  4. 指针变量使用之前要检查他的有效性(以后开发中要做非空校验)

说明:NULL是空常量,它得值是0,这个NULL一般存放在内存中的0x00000000位置,这个位置只能存放NULL,不能被其他程序修改

空指针:

空指针又被称作悬空指针,当一个指针的值是NULL,这个指针被称为空指针,对空指针访问会运行报错(段错误)

二级指针:

定义:又被称为多重指针,引用一级指针的地址,此时这个和指针变量就定义为二级指针

定义格式:数据类型 **变量名 = 指针数组的数组名或一级指针的地址

举例:

结论:二级指针和指针数组是等效的,和二维数组不等效

      二位数组和数组指针是等效的,和二级指针不等效

二级指针的用法:

·如果是字符的二级指针,可以像遍历字符串数组一样遍历它

·如果是其他的二级指针,就需要解引用两次访问它所指向的数据

main函数的函数原型:

·main函数有多种定义格式,main函数也是函数,函数相关的结论对main函数也有效(也可以定义main函数的函数指针)

·main函数的完整写法:

·扩展写法:

   

·说明:  

1.argc、argv是形参的名称,他们两可以修改

2.main函数的扩展写法有些编译器不支持,编译报警高

3.argc、argv常规写法:(1)argc:存储了参数的个数

             (2)argv:存储了所有参数的字符串形式

4.mian函数是系统通过函数指针的回调形式调用的

·注意:如果一个函数没写返回值类型,默认函数返回值类型为int

案例:

常量指针与指针常量:

常量:分为字面量于只读常量,字面量(就是我们平时直接操作的如printf(12),printf(“hello”))。只读常量使用关键字const修饰,凡是被这个关键字修饰的变量,一旦赋值,值就不能改变

语法:

常量指针:

定义:本质是一个指针,指针指向的数据不能改变

定义格式:

举例:

结论:1.常量指针指向的数据不能被改变(不能解引用简介修改数据)

2.常量指针的地址可以改变

应用场景:作为形式参数,实际参数需要给一个常量

指针常量:

定义:指针的指向不能改变

定义格式:

举例:

结论:1.指针常量的指向不能被改变(不能给指针变量重新赋地址值)

2.指针常量指向的数据可以改变

注意:指针常量在定义时就要赋值,不能先定义后赋值,否则报错

案例:

常量指针常量:

定义语法:

举例:

作用:p的指向不能被改动(地址),p指向的数据不能被改(地址对应内存中存放的数据)

动态内存分配:

我们要想实现动态内存分配,就需要学习标准C提供的函数库

1. 函数所属的库文件

2.函数的原型---函数的声明·函数名·形参·返回值类型

3.函数的功能

注意:内存分配函数咋子申请内存时,建议用多少申请多少,可以有少量的预留量,但不能越界访问(虽然编译和运行不报错,但数据不安全)

常用函数

malloc

·头文件:#include <stdlib.h>

·函数功能:C库函数void *malloc(size_t  size)分配所需的内存空间,并返回一个指向他的指针

·函数原型:(1)函数名:malloc

  (2)形参:size_t  size:内存块的大小,以字节为单位,本质上就是一个                 unsigned int

  (3)返回值类型:viod*:该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回NULL

·举例:

·说明:1.malloc函数分配的内存没有默认值,是不确定数,大概率是0

2.malloc函数申请的内存空间连续

calloc:

·头文件:#include <stdlib.h>

·函数功能:C库函数void*calloc(sizeof_t nitems,size_t size)分配所需的内存空间,并返 回一个指向他的指针,malloc和calloc之间不同点是,malloc不会设置内存为     0,而calloc会设置内存为0

·函数原型:void*calloc(size_t nitems,size_t size)

函数名:calloc

形式参数:(1)size_t nitems:申请多少个

(2)size_t size:一个占几个内存单元(一个内存单元等于一个字节)

       返回值类型:void*:该函数返回一个指针,指向已分配大小的内存,如果请 求失败,返回NULL

·举例:

·说明:

realloc:

·头文件:#include <stdlib.h>

·函数功能:尝试重新调整之前调用malloc和calloc所分配的p所指向的内存块的大小

·函数原型:void*realloc(void * ptr,size_t size)

函数名:realloc

形式参数:void*ptr:是malloc和calloc的返回值

                  size_t size:是重新分配后的内存大小、

               返回值:void*该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回NULL

·案例:

·说明:

free:

·头文件:#include <stdlib.h>

·函数功能:释放之前调用malloc、calloc、realloc所分配的内存空间,是访问完记得使用NULL

·函数原型:void free(void *ptr)

函数名::free

形参:viod *ptr:calloc、malloc、realloc的返回值

返回值类型:void:没有返回值

·注意:1.对内存中的指针才需要回收,栈中系统会自动回收

2.堆内存不能重复回收,运行会报错‘

·说明:1.堆内存空间相比较栈要大很多

   2.内存分配函数的指针变量可以参与运算(只读),但不能被修改(p++或p+=i是 错误的)

void于void*的区别:
·定义:void:是空类型,是数据类型的一种

        void*:是指针类型的一种,可以匹配任意类型的指针,类似于通配符

·void

   ·说明:void作为返回值类型使用,表示没有返回值,作为形参,表示形参列表为空,在调用函数时不能给实参

·举例:

·void*

·说明:·void*是一个指针类型,但该指针的类型数据不明确,无法通过解引用获取内       存中的数据,因为void*不知道访问几个内存单元

·void*:是一种数据类型,可以作为函数返回值类型,也可以作为形参类型

·void*:类型的变量在使用之前必须强制类型转换,明确它能够访问几个字节的内存空间

标签:函数,常量,void,C语言,内存,指针,size
From: https://blog.csdn.net/m0_74872789/article/details/141180641

相关文章

  • 【C语言】内存管理函数详细讲解
    目录1.C语言内存管理函数详细讲解1.1`malloc`1.2`calloc`1.3`realloc`1.4`free`2.内存管理函数的深层理解2.1内存分配的原理2.2内存分配的性能考虑2.3动态调整内存块的大小2.4处理内存分配失败3.高级应用示例3.1内存池的实现3.2实现内存泄漏检测3.3内存......
  • C语言---数据类型和变量
    1.数据类型介绍  C语⾔提供了丰富的数据类型来描述⽣活中的各种数据。使⽤整型类型来描述整数,使⽤字符类型来描述字符,使⽤浮点型类型来描述⼩数。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作。2.内置类型1.字符型char  ......
  • [Lang] 智能指针
    [Lang]智能指针智能指针能够有效简化内存管理,避免内存泄漏和悬挂指针等问题。1.std::unique_ptr独占所有权:一个std::unique_ptr对象拥有其管理的对象的唯一所有权。不允许复制:不能进行复制操作,尝试复制会导致编译错误。允许移动:可以将std::unique_ptr对象移动到另一个......
  • 长度最小的子数组 滑动窗口法(双指针) 解决
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target=7,nums=[2,3,1,2,4,3]......
  • C语言——指针(数组,函数)
    通过指针引用数组数组元素的指针数组指针:数组中的第一个元素的地址,也就是数组的首地址指针数组:用来存放数组元素地址的数组(存放数组元素指针的变量),称之为指针数组。eg://定义一个一维数组inta[]={1,4,9};//使用指针变量存储数组的第一个元素的首地址,也就是数组......
  • C语言入门零基础:9、字符串
    一、字符串定义    1、字符串和字符数组的区别:        字符数组存任意数组都可以,它可以以任何字符结尾;        字符串需要使用字符数组来存,但是结束必须要有一个'\0'字符;        只有字符串才能用双引号定义 ......
  • C语言实现斐波那契数列
    斐波那契数列(Fibonaccisequence)是一个经典的数学问题,在数学和计算机科学领域都有广泛的应用。斐波那契数列是以意大利数学家列昂纳多·斐波那契(LeonardodaFibonacci)的名字命名的,他通过兔子繁殖的例子引入了这一数列。斐波那契数列的每一项都是前两项的和,且从第三项开始,即1、......
  • 嵌入式软件--C语言项目 客户信息管理系统
    考虑到目前C语言的学习是以为嵌入式做基础而进行的,项目所使用到的语法和结构都是嵌入式常用到的,这是较为特殊和针对性的项目,不与其他同名项目作比较。若有参考着谨慎借鉴。实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。1.需求说明(1)主菜单......
  • 【自用10.2】C++结构体-指向结构体的指针&使用结构体传递值
    指向结构体的指针#include<stdio.h>#include<stdlib.h>#include<string.h>struct_friend{charname[32];charsex;//m-男f-女intage;};intmain(void){struct_friendgirl={"小珑",'f',18};stru......
  • C语言-有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见 图8.43。写
    1.题目要求:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图8.43。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。2.解题思路:可采用指针法,可将数组中最后一位元素的值赋给中间变量暂存,然后将剩余数组中的元素通过指针依次后移一位......