首页 > 其他分享 >c语言指针

c语言指针

时间:2024-12-23 20:02:28浏览次数:5  
标签:语言 指向 int 函数 数组 类型 指针

指针

指针=>内存地址

指针变量=>存储着内存地址的变量

定义格式:

数据类型*变量名 (数据类型要跟指向的数据类型保持一样)

指针作用

  1.查询数据
    int a=10;
    int* p=&a;
    printf("%d\n",*p);

2.存储数据/修改数据
 *p=200;
  printf("%d ",*p);

3.参数传递

4.内存管理


指针的作用

1.操作其他函数中的变量

2.函数返回多个值

3.函数的结果和计算状态分开

4.方便的操作数组和函数


指针步长

 是指通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量
 指针的步长取决于所指向的数据类型
 

指针的使用细节:

1.指针变量的名字

 int*p
    名字为p,不是*p

2.数据类型要跟指向的变量类型保持一样

3.指针变量占用的大小,跟数据类型无关,跟编译器有关
                32位:4字节
                64位:8字节
4.给指针变量赋值的时候,不能把一个数值赋给指针变量

  

指针的运算

  有意义的操作
 

               指针跟整数进行加,减操作(每次移动N个步长)保证:内存空间是连续的  //数组
                                                                                 
               指针跟指针进行减操作(间隔步长)


 无意义的操作

              指针跟整数进行乘除操作
                
              原因:此时指针指向不明

              指针跟指针进行加,乘,除操作

   

指针的类型


 指向不明的指针

   野指针:指针指向的空间未分配

   悬空指针:指针指向的空间已经分配,但是被释放了

 
 

  没有类型的指针
  

特殊类型:
 
     void*p   不表示任何类型

    特点:无法获取数据,无法计算,但是可以接收任意地址

   

 二级指针

     int**p
    作用1:利用二级指针修改一级指针里面记录的内存地址
    作用2:利用二级指针获取到变量中记录的数据


 
 数组指针  

 指向数组的指针,就是数组指针
        
     实际上指向的是数组首元素的地址

   数组指针的细节
                   arr参与计算的时候,会退化为第一个元素的指针

      特殊情况:
                   sizeof运算的时候,不会退化,arr还是整体
                   &arr获取地址的时候,不会退化(步长==数组类型*数组长度)
                 

   

指针数组

   存放指针的数组                                                                                                                          作用:用来存放指针
   举例: int*p[5],这个数组里面存放这int类型的指针                                                                                                                                                                                                                                                                                                                                                                                               

  函数指针                                                                                                                              

  格式:
        返回值类型 (*指针名) (形参列表)
  作用:
        利用函数指针,可以动态调用函数

指针函数(返回值是指针)

c语言允许函数的返回值 是一个指针 (地址),这样的函数称为 指针函数

格式:

返回值类型 * 函数名(形参列表){

函数体

}

函数体中的 return 命令返回一个地址

void指针

C语言中,一共有几种指针类型,其中最特别的就是void *指针。

void *指针就是指向任何类型的指针, 在编译的时候不会确定其指向的类型,是在程序中进行指向的。 这种类型的指针 不能直接进行取内容或递增递减的操作.必须先转成 别的类型的指针才可以执行,否则报错

空指针NULL

NULL空指针 注意区分大小写

指一个指针不指向任何地址,我们称之为空指针,

NULL是一个值为0的宏常量

  • 变量的指针。
    • 浮点型指针(float*, double*):指向浮点型变量的指针。
    • 字符型指针(char*):指向字符或字符串的指针。
  • 数组指针与指针数组:
    • 数组指针(如int (*p)[10]):指向一个包含10个整数的数组的指针。
    • 指针数组(如int* arr[5]):一个数组,其元素是指向整数的指针。
  • 函数指针:
    • 函数指针(如int (*p)(int, int)):指向一个接收两个整数参数并返回一个整数的函数的指针。
  • 特殊指针:
    • 字符串常量指针(如char* ps = "abcdef";):指向字符串常量的指针,但应注意字符串常量本身是只读的。
    • 指针常量(如int* const p):指针的值(即它指向的地址)不可变。
    • 常量指针(如const int* p):指针指向的值(即该地址处的数据)不可变。
    • 常指针常量(如const int* const p):既不可修改指向的地址,也不可修改指向地址的值。
  • 多级指针:
    • 二级指针(如int** p):指向指针的指针。
    • 三级指针、四级指针等:以此类推,指向更高级别指针的指针。
  • 其他特殊指针:
    • 野指针:未初始化的指针或已经释放但未被置为NULL的指针。
    • 空指针(NULL或nullptr):不指向任何有效内存地址的指针。
  • 结构体和联合体的指针:
    • 结构体指针(如struct A* p):指向结构体类型的指针。
    • 联合体指针(如union B* q):指向联合体类型的指针。

标签:语言,指向,int,函数,数组,类型,指针
From: https://blog.csdn.net/2403_89181725/article/details/144580355

相关文章

  • c语言期末复习----排序算法
    一、冒泡排序 思想:两两相邻元素比较,不满足顺序就交换,满足顺序就找下一对升序代码:voidBubble_sort(int*a,intlen){//每一轮将最大的排到最后,n个元素需要n-1轮 for(inti=0;i<len-1;i++) {//i轮后i个已经排好就不用再两两比较了 for(intj=0;j<......
  • 【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
    【C语言】函数指针与指针函数文章目录@[TOC](文章目录)前言一、指针数组二、数组指针三、函数指针四、指针函数五、函数指针数组六、回调函数七、参考资料总结前言使用工具:1.DEVC++提示:以下是本篇文章正文内容,下面案例可供参考一、指针数组优先级关系:()>......
  • 知识图谱与大模型 Part 1:使用大型语言模型自动进行知识图谱构建
    导读大模型刚火起来的时候,很多人认为知识图谱没前途了,会被大模型代替,因为知识已经被学到大模型肚子里了。跑了半天后,发现不是那么回事,发现大模型和知识图谱就是两个层面的东西,从我的角度:知识图谱更偏加工出来的产品,这个产品既可以用到其他场景,也可以反过来提升大模型......
  • 教你学会自定义鼠标指针
    我现在用的一款很好看的指针如下图所示:是不是真的还挺不错的,还有更多可好玩的样式:只要先下载了这个软件,这些都是可以免费使用的,看腻了就换一个!下载过后操作这个就可以直接生效了,都不用重新启动的......
  • cpp智能指针
      普通指针的不足new和new[]的内存需要用delete和deletel]释放。程序员的主观失误,忘了或漏了释放。程序员也不确定何时释放。普通指针的释放类内的指针,在析构函数中释放。C++内置数据类型,如何释放?new出来的类,本身如何释放?C++11新增三个智能指针类型uniqu......
  • 谈谈大语言模型和机器翻译:以及我们如何来应对
    大型语言模型(LLM)已经风靡全球。前排提示,文末有大模型AGI-CSDN独家资料包哦!其中一些模型,例如OpenAI的GPT-4和谷歌的PaLM2,已经在多语言数据集上进行了训练,并且至少在理论上也应该能够很好地完成机器翻译任务。如何充分发挥大型语言模型在机器翻译中的潜力?下面我们来......
  • PTA L1-059 敲笨钟 c语言基础
    #include<stdio.h>#include<string.h>intong(char*poem)//判断是否押韵 {   inti,len=strlen(poem),flag=0;   for(i=0;i<len;i++){      if(poem[i]==','){         if(poem[i-1]=='g'&&poem[i-2]=='n'&......
  • 创建仓颉编程语言的第一个项目
    创建仓颉编程语言的第一个项目安装仓颉编程语言编译器第一个仓颉项目安装仓颉编程语言编译器安装仓颉编程语言编译器,是一个需要非常强的动手能力的过程——有大量的命令行操作。这不是仓颉编程语言独有的特点。现在流行的编程语言,比如kotlin、java、rust、go、sca......
  • Go语言,查询MySQL数据库
    在Go语言中,查询MySQL数据库的一个常用库是database/sql标准库首先,确保你已经安装了MySQL驱动:goget-ugithub.com/go-sql-driver/mysql示例代码main.gopackagemainimport("database/sql""fmt""log"_"github.com/go-sql-driver/mysql&qu......
  • C语言常见错误总结
    语法错误 -括号不匹配:在函数定义、条件语句、循环语句等使用括号的地方,忘记添加或多添加括号,会导致编译错误。例如, if 语句中条件表达式括号不匹配,编译器会提示语法错误信息,指出缺少或多余的括号位置,仔细检查括号的成对性可避免。-分号缺失或多余:C语言语句以分号结束......