首页 > 其他分享 >走进“指针”的大门

走进“指针”的大门

时间:2023-04-02 17:09:45浏览次数:33  
标签:指向 走进 char 地址 内存 类型 指针 大门

1、前言

      指针是C语言的“精髓”,学C语言不学指针等同于C语言白学,这话语说的虽然直白,但是却真正体现出了指针在C语言中的重要性。

      要想成为C语言方面的大佬,那你必须玩转指针,指针在C语言中的重要性不言而喻,但它也是我们入门C语言的拦路虎,很多大学的非计算机专业对C语言的讲述也都是到指针之前数字为止,很多人一提到指针头脑中就出现了一个字“难”,因为在生活中我们接收到的信息都在给我们灌输一个指针很难的思想,这种思想让不少C语言入门者对指针望而退步,困住他们的不是指针真的很难,而是他们自己认为指针很难这种惯性思维,从而让他们不敢轻易去尝试指针,但当我们真正静下心来,不被外界惯有思维干扰,去解剖分析理解指针,之后你会发现指针原来也就这样,真正难的是第一步,当年入门了之后,指针的大门就已经为你打开,你可以畅流在指针的海洋里。

2、指针是“什么”

2.1 存储

      计算机的数据都存储在内存中,但当要使用需要的数据的时候,怎样才能在内存中找到相应的数据呢? 答案是通过内存的地址查找,在计算机中内存都有相应的地址编号,知道相应的地址就能取出对应地址中的数据,你可以在脑海中想象出这样一个画面,有一个地址表,这个地址表中的每一个地址都通过一个箭头指向一块内存。

      “指针”,我们看到这个词脑海中的第一印象应该就是“想针一样的箭头指向一个地方”,是不是就与上面脑海中的图像中的箭头对于上了,我们最常听到的一句话关于指针的话就是“指针指一个地址”,但这句话也常常把人引入误区,让人只关心指针的指向,而未去理解指针的本身。

2.2 指针“真容”

      要想理解指针,必须先理解指针它的本来面目是什么,而不是说起指针的第一印象就是“指针指向的是一个地址”、“指针存储的是一个地址”,当然这些说的都没错,但我们在入门的时候应该掀开这一面纱,去理解它的”真容“。

      指针的“真容”是什么呢?我的答案是它是一块内存。

char a;
int b;
float c;
double d;

      看到上面变量的定义,相信大家都能理解,通俗的话来讲就是,由于要存储数据类型的不同,我们通过不同的变量类型定义变量来存储相应的数据,但是在计算机底层中,这些不同变量的数据都是存储在一块块的内存中,区别只是对数据的处理方式以及内存的大小不同,他们实际上就是一块块的内存,通过变量名来与这些内存联系起来,通过这来看其实“变量名就指向相应的内存,通过变量名可以对相应的内存进行操作”,其实变量名可以看作特殊形式的地址,当然和真正的地址还是有很大的区别,变量名是编译器在处理,在这不做过多的讲述,有兴趣的可以自己去找相应的资料进行扩展。

char *ptr;
int *ptr;
float *ptr;
double *ptr;

      上面是一些最常见的指针形式,指针同上面的基础类型一样,在计算机的底层中也是一块块的内存,同上面的那些基础类型内存一样存储的都是数据,只是指针对应的内存中存储的数据是其它内存的地址,通过这个地址可以对相应的内存中的数据进行操作,所以不要固有印象的认为“指针是一个地址”,其实指针也是一个变量,其有自己对应的内存,在内存中可以存储其它变量的地址,当然指针这块内存也有自己的地址编号,所以可以二级指针、三级指针进行套娃下去,既然指针也是一个变量,所以我们也可以通过改变里面的数据来使其指向不同的地址。

3、指针是一个“泛称”

      指针是一个“泛称”,它不像int、char、float、double等等变量类型一样,有自己的专一的类型,指针的类型和它指向的地方相对应,它指向什么类型的数据就要定义成相应类型的指针,由于不同类型的数据所占内存的大小不同,所以其对应的指针移动时的大小不同。

      我们要把指针自身类型和其指向类型区分开,不要把两者的概念进行混淆,下面的是一些最基础的指针类型的定义,理解了之后可以看看复杂的指针,比如二级指针、三级指针、指向数组的指针、指向函数的指针等等。

char *ptr;
		指针类型未char *
		指向char类型
int *ptr;
		指针类型未int *
		指向int类型
float *ptr;
		指针类型未int *
		指向float类型
double *ptr;
		指针类型未int *
		指向double类型
struct t *ptr;
		指针类型未 struct t *
		指向结构体t类型

4、“&”和“*”

      &是取地址运算符,*是间接取值运算符。

      在定义完指针之后,怎么把对应类型变量的地址赋值给指针呢?答案是通过&取地址运算符来取出相应变量得到地址。

char a;
char *prt;
prt = &a;
/*&a的结果未a的内存的地址*/
/*其它类型的数据和对应类型的指针也是相应的操作*/

      定义了指针,也进行了相应的赋值,那要怎么通过指针去操作其所指向的数据呢?答案是通过间接取值运算符。

char a;
char *prt;
/*定义指针*/
prt = &a;
/*指针赋值*/
*prt = 'a';
/*通过指针操作指向的内存
上一条语句等同于a='a'*/

5、总结

      本文介绍了一些指针的基础入门知识点,希望能对大家有帮助,如有错误,请大家评论指出,作者万分感谢。

(之后有空或者大家有需求,将写一些C语言指针的进阶,比如复杂指针的定义及分析、指针的算数运算、指针与数组等等内容)

标签:指向,走进,char,地址,内存,类型,指针,大门
From: https://blog.51cto.com/u_15945267/6164925

相关文章

  • go 指针
    前言:变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置,当一个指针被定义后没有分配到任何变量时,它的默认值为nil。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址。指针变量通常缩写为ptr。正文:通过指针,获取变量的值num:=5ptr:=&num   ......
  • 2023-03-21-将指针所在地址传入函数来创建链表的一种写法
    如下,通过将指针所在的地址传入函数中即**p的形式,来保证直接对地址进行运算,而不需要再返回一个链表//双链表#include<stdio.h>#include<stdbool.h>#include<malloc.h>typedefstructDNode{intdata;structDNode*prior,*next;//prior指向上一个结点,next指......
  • 【LBLD】双指针技巧秒杀七道数组题目
    【LBLD】双指针技巧秒杀七道数组题目快慢指针技巧classSolution{public:intremoveDuplicates(vector<int>&nums){intfast=0;intslow=0;while(fast<nums.size()){if(nums.at(fast)!=nums.at(slow)){......
  • EMI顺应数字音乐潮流,向应用开发者打开大门
    开发音乐应用对开发者来说并不是件容易的事情,今天音乐集团EMIMusic和智能音乐平台The EchoNest宣布达成了一个新的协议,新的协议将有助于开发者更容易开发基于音乐的应用。EMIMusic将会为艺术家提供创意纲要,并为开发者提供为艺术家开发应用的机会,如Gorillaz,ThePetShopBo......
  • 结构体里面定义一个该结构体类型变量为什么必须用指针
    一.错误:structTreeNode{intval;TreeNodeleft;TreeNoderight;};二.分析原因:如果在定义classA时,A域的类型是未定义的classA而不是指向classA对象的指针类型,编译器会尝试在编译时分配一块内存给A域,但由于classA的定义还没有出现,因此无法确定A域需要多......
  • 指针作业
    #include<stdio.h>#include<string.h>#include<assert.h>#include<math.h>voidreverse(char*str){assert(str);//断言intlen=strlen(str);//这里是字符串char*......
  • 删除链表的第N个节点|栈、双指针
    删除链表的倒数第N个节点类似于删除链表中的第N个节点,但是这里是倒数第N个且不知道链表的长度,如果用删除第N个节点的方法去解决问题的时候需要先知道链表的长度。这就需......
  • 环形链表|哈希、快慢指针
    环形链表判断一个链表中是否有环,如果有返回环的起始位置。难点有两个,一是判断是否有环,二是找到起始点。这里有两种方法,一种是哈希集,另一种是快慢指针。对应题目142.环......
  • 力扣-数组-双指针
        1classSolution(object):2defremoveElement(self,nums,val):3"""4:typenums:List[int]5:typeval:int......
  • 指针
    1、指针:用来存放地址的,地址是唯一标识一块地址空间的2.1、意义:指针的类型决定了指针进行解引用操作时,访问空间的大小     int*---访问4个字节     char*-......