首页 > 其他分享 >指针, C语言的精髓

指针, C语言的精髓

时间:2024-12-24 10:13:32浏览次数:8  
标签:下标 变量 内存条 int 精髓 C语言 访问 指针

指针, C语言的精髓

 

指针, C语言的精髓

莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA, 树剖求 LCA 比倍增求 LCA 常数小).

什么是指针

保存变量地址的变量叫做指针.

这是大概的定义, 但是Defad认为这个定义不太好理解, 所以我们先不看.

我们的电脑里都有随机存储器 RAM 也就是内存条, 所有变量和数组都在这里, 这个应该大家都知道.

那么我们把内存条看成数组, 头地址显然是 0.

这也解释了为什么不能用 NULL, 因为一般不用数组第 00 个.

那么现在我们有一个整数变量 x.

  int x;

这个 x 在内存条哪里呢?

& 可以获取变量在内存条的下标, 所以 x 的下标是 &x.

那么我们怎么访问内存条的第 &x 项呢?

刚才我们说, 内存条头地址是 0, 根据数组访问的方法, 可以想到用 0[&x] 访问变量 x.

我并不是在瞎写, 我只是觉得这样比较好理解, 真正用的时候写这个的应该腰斩.

那么我们现在用一个变量存储这个 x 的下标.

  int *p = &x;

int* 类型表示保存 int 类型变量在内存条里的下标的变量.

所以我们可以用 p 代替 &x 就是 0[p].

但是我们现在有一个语法糖.

*p 就是表示 0[p], 因为数组访问的本质是指针移动, 比如 a[3] 实际上是 *(a + (3)).

所以我们可以用 *p 来访问在内存条里 p 保存的下标.

同理 *&x 也一样, 但是你变量都在这了就不需要取下标再访问下标了.

指针能干什么

我们有一个栈存储我们调用的函数和函数内部开的变量, 叫系统栈.

但是这样带来的问题就是我们给函数传入的变量是把值传进去了, 函数并不知道是要对值更改还是对变量本体更改.

现在有了指针就好办多了.

比如写一个交换函数.

  void exchange(int *x, int *y) {
  *x ^= *y;
  *y ^= *x;
  *x ^= *y;
  }

就可以传入地址后在内部做交换.

刚才如果我没提到什么是地址, 那就是在内存条的下标了.

还有, 我们可以申请一块内存, 使用完再释放掉.

  // 申请, 这里要强转成目标类型
  int *a = (int*)malloc(sizeof(int) * 100);
   
  // 这里做点什么
   
  free(a); // 释放

申请来的可以当数组用, 也可以当变量用, 需要指针访问 (类似 *p).

比如平衡树的一个结点, 插入时申请一个, 删除时释放掉.

这样其实相当于一个垃圾回收机制.

标签:下标,变量,内存条,int,精髓,C语言,访问,指针
From: https://www.cnblogs.com/Leo_wl/p/18626716

相关文章

  • c语言结构体
    结构体   自定义的数据类型   就是由很多数据组合成的一个整体   每一个数据,都是结构体的成员定义struct结构体名字 { 成员1; 成员2; 。。。}struct GirlFriend{ charname[100]; intage;} 使用structGirlFriend gf1;strcpy(......
  • C语言——void指针和空指针的区别
    面试题1、void指针    (1)格式:void*    (2)void指针就是指向任何类型的指针        (3)在编译的时候不会确定其指向的类型,是在程序中进行指向的    (4)这种类型的指针不能直接进行取内容或递增递减的操作,必须先转成别的类型的指针才可以执行,否则......
  • Zed调试宏 C语言错误日志 异常错误调试信息
    1、C中的错误码           在C语言中通过返回错误码或设置全局的errno值来反馈错误问题。errno.h是一个头文件,它定义了一个全局变量errno,用于在程序中记录和报告错误的原因。这个机制主要用于处理系统调用或标准库函数出错时的错误反馈。当系统调用或库函数遇到......
  • c语言字符串
    字符串定义方式:  charstr[4]={'a','b','c','\0'};   charstr[4]="abc";   //细节一:在底层,实际存储的时候,c语言会将字符串“abc”转换成字符数组进行保存,且末尾加上‘\0’.   //细节二:数组长度要么不写,如果写的话要将结束符‘\0’也计算在内   ......
  • c语言指针
    指针指针=>内存地址指针变量=>存储着内存地址的变量定义格式:数据类型*变量名(数据类型要跟指向的数据类型保持一样)指针作用 1.查询数据  inta=10;  int*p=&a;  printf("%d\n",*p);2.存储数据/修改数据 *p=200; printf("%d",*p);3.参数传递4......
  • 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++提示:以下是本篇文章正文内容,下面案例可供参考一、指针数组优先级关系:()>......
  • 教你学会自定义鼠标指针
    我现在用的一款很好看的指针如下图所示:是不是真的还挺不错的,还有更多可好玩的样式:只要先下载了这个软件,这些都是可以免费使用的,看腻了就换一个!下载过后操作这个就可以直接生效了,都不用重新启动的......
  • cpp智能指针
      普通指针的不足new和new[]的内存需要用delete和deletel]释放。程序员的主观失误,忘了或漏了释放。程序员也不确定何时释放。普通指针的释放类内的指针,在析构函数中释放。C++内置数据类型,如何释放?new出来的类,本身如何释放?C++11新增三个智能指针类型uniqu......
  • 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'&......