指针概念总结 第1篇
这里可以看到,指针的定义方式是: type + 。其实: char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放int 类型变量的地址。
对指针±代表+或-类型的大小。
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
对指针解引用代表指针能xxxsizeof(type)个字节。
总结: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能xxx一个字节,而 int* 的指针的解引用就能xxx四个字节。
指针概念总结 第2篇
字符串的名称为首元素的地址
定义方法:
有种常量字符串的定义,容易出错:
此时,pstu作为常量字符串的指针,不能对其解引用操作去改变常量的值,故一般加上const:
易错点2:
arr1 != arr2 :这两个作为不同数组的首元素地址,故不同
parr1 == parr2:这两个指针指向常量,由于是常量,因此空间只开辟了一个,所以指向了相同的空间
指针概念总结 第3篇
定义: 数组内元素的类型(*p)[数组的元素个数]
例如一个又五个元素的整形数组的指针 —— int (*p)【5】
理解:理解这个数组指针要明白,它本质是指针,用来存放的是一整个数组的地址,在定义的时候,因为【】的优先级比*的高,所以要先用括号,强调p是一个指针(本质),再想到他是什么类型的指针,这里因为是数组,所以自然能想到一个数组重要的两个特征就是,一个是存放的数据类型,一个是放了多少个,再根据定义多看两眼,试着打几下代码不难掌握
指针概念总结 第4篇
在计算机科学中,指针是编程语言中的一个对象,利用地址,它直接指向存在电脑储存器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,指针指向该变量单元。因此,将地址形象化地称为指针。意思是通过它能找到以它为地址的内存单元。从另外一个方面来讲,指针就是一个变量,用来存放内存单元的地址(编码),地址唯一标识一块内存空间。
可通过下面C代码来加以说明:
ps:存放在指针中的值都被当做地址来处理,在32位平台上一个指针变量占4个字节,在64位平台上一个指针变量占8给字节
指针概念总结 第5篇
数组名表示首元素地址
注:以下两种情况例外 1、&数组名(如&arr) 数组名不是首元素地址,数组名(arr)表示整个数组,&数组名(&arr)表示取出整个数组的地址 arr—>arr+1,向后跳跃了4个字节 &arr—>&arr+1,向后跳跃了40个字节(十六进制A20减9F8得28,换算成十进制为40)
2、sizeof(数组名),如sizeof(arr) 数组名(arr)表示整个数组,sizeof(arr)计算的是整个数组的大小
指针数组实质上为数组,与整形数组(存放整形)、字符型数组(存放字符型)类比可知,指针数组用于存放指针。
具体解释见如下代码
数组指针的用法如下
通过指针数组与数组指针的学习,我们应该掌握下列代码的含义 int arr[5] (一个五个元素的整形数组) int *arr[5] (指针数组,数组包含五个元素,每个元素类型为int *) int ( * arr)[5] (数组指针,指向一个有五个元素的数组) int( * arr[10] )[5] (是一个数组,数组有十个元素,每个元素为一个数组指针,该数组指针指向的数组有五个元素,每个元素的类型为int)
指针概念总结 第6篇
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针 。
对于二级指针的运算有:
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实xxx的就是pa。
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a。
指针概念总结 第7篇
定义一维数组:int x[6]={1,2,3,4,5,6}; 此时一维数组的空间如下: (1)在数组中,作为数组的首元素的数组名x是一个地址常量,也叫指针常量。此时的数组名x是不能被修改的。 (2)数组的最大特点之一,所占的内存空间是连续的。 运算符 [ ]其实就是指针的另一种形式, 例如:a[2]=*(a+2)=2[a]。所以给指针xxx数组带来了方便。 //xxx数组的形式有一下三种
(3)操作符之间的优先级问题! *和++优先级相同,结合方向自右向左,所以指针和自增自减的时候,尽量加上();
指针概念总结 第8篇
函数传参有两种:①传值传参②传址传参 第一种方式相当于将实参的值拷贝给了形参 第二种方式是将地址传给形参,形参通过地址可以找主函数中的变量,从而实现了数据共享。
返回来的地址可以xxx一个或者一段数据,从而实现了函数返回多个值的功能能——一般情况下,函数只能返回一个值!
(1) ①数据指针:指向整数、实数、字符、数组的指针。 函数指针:指向函数的指针。 ②函数指针的相关介绍:在c语言中,函数名代表函数的入口地址。当程序在执行过程中调用某函数时,程序控制转移位置就是该函数名表示的该函数代码的入口地址。当一个指针存放该入口地址,就称该指针为指向函数的指针,简称函数指针。 ③函数指针变量的声明形式: 例如程序以定义函数f: float f(int x,int y); 则可以定义函数指针p: float (*p)(int ,int ); 并给函数指针p赋值: p=f;
④函数指针的举例:
⑤指针函数调用函数的格式: (*函数指针名)(实参表); (2)函数指针和数据指针的区别 ①数据指针指向内存中的数据存储区;而函数指针则是指向程序代码存储区。 ②目标运算符作用于数据指针,是用来xxx指针所指向的数据;而目标运算符作用于函数指针,则是将程序控制转移到指针所指向的函数入口,执行函数体。 ③数据指针可以进行自增和自减等运算;函数指针则不能进行这些运算
指针概念总结 第9篇
定义:利用b的函数指针,在函数a里面xxx函数b,这个函数b就被叫做回调函数
回调函数的内容,我们用几个例子去感受一下
定义:void qsort(const void*,int,int,void (*p) ( const void * , const void *) );
功能:实现数组的排序,数组的类型可以是任意类型的,例如:浮点型数组、结构体数组...
返回类型:void
参数部分:我们讲从原理的角度解释参数部分,也方便记忆
第一个参数:数组的首元素地址 arr
第二个参数:数组的元素个数 sizeof(arr)/sizeof(arr[0]);
第三个参数:数组中单个元素的大小 sizeof(arr[0]);
第四个参数:由你自定义的一种比大小函数,规则由你自己制定和实现,
void my_cmp(const void* e1,const void* e2);
如何理解这些参数呢?我们用我们熟知的冒泡排序去解释这些参数。
我们都知道,冒泡排序就是将数组里的两个元素不断的进行比较,然后再进行位置上的调整和交换
但是过去的冒泡排序中,我们只能实现整形数组的排序,那么我如果学用冒泡排序的思想去排序一
各浮点型的数组或者结构体数组时,我们该怎么办呢,在实际的应用场景中,更多时候我们需要排
序一个结构体数组,例如:学生名单按成绩高低进行排序。因此我们能不能定义一个函数让它能实
现各种各样的函数呢?我们又该怎么样去定义这个函数呢?
首先,我们肯定要数组的首元素地址和数组的元素个数,但迎面而来的第一个问题就是:
1.我如何要让函数能够接收所有类型的首元素地址?
这里介绍一个void型的指针,它可以用于接收任何类型的指针
但我们都知道指针类型决定了它能够xxx的空间大小和加减运算时的步长
因此void类型的指针不能通过地址改变值,也不能进行加减运算,为了代码的稳定性
我们通常在定义void*的指针时,在前面加上const
有了void型指针,我们接受各种各样类型的首元素地址的问题就解决了,我们也能理解,为什么第一个参数的类型是const void*,但是问题又来了,我们无法通过void*去操作数组。
2.我们该如何通过void*去操作数组呢?
我们可以通过强制类型转换去将得到的地址转换成我们传进来的数组,如何就可以进行操作了,但是我们似乎不能通过向函数传参告诉我数组的类型,因此第3个问题。
3.作为开发函数的人如何“知道”数组的类型呢?
学到这里的时候,我不由的惊叹程序员的智慧,他先指针void*类型的转换成char*的指针
我们都知道,char*的指针每次xxx只xxx一个字节的内容,如果这个时候,我知道你每个数据的大小,那么他就能清楚你这个数组里面元素的大小单位是多少,从而实现对数组的操作。
因此,第三个参数就是数组内单个元素的大小
我们继续回到冒泡排序上考虑,我新设计的万能冒泡已经解决了,如何传不同类型参数的问题以及如何操作不同类型数组的问题,还有什么问题呢?
我们知道,一个结构体变量里面就可能存着各种各样的数据,我们具体要根据其中的哪一个去进行排序呢?例如一个学生表,我可以按学号排,也可以按成绩排。因此我们还差一个能够帮助我们还得想办法解决如果比大小的问题
4.我们该如何让函数去按我们的规则排序?
我们想怎么排序,程序员在设计这个函数的时候是不可能知道的,因此我们要通过一个我们按我们想法制定好规则的比较函数my_cmp去实现排序,因此第四个参数是我们自定义的一个排序函数,这个函数就被称为回调函数。
在我们定义这个函数的时候,函数返回类型是int,参数是(const void* e1,const* void e2)
e1和e2是我们要排的两个函数,这个函数返回值>1时 e1>e2,这个函数返回值<1时 e1
至于参数为什么是void*,这个和问题1原因一样。
——————————————————————————————————————————
通过以上分析,我们应该能更深刻的理解这个函数的参数设计,已经能更好的记住如何使用
这次,我们可以试着真的动手将我们熟知的冒泡排序改造成万能冒泡排序了
此处是我自己练习实现的自定义冒泡,其中为了复习之前学的结构体类型的定义和输出,因此用了结构体数组进行排序,按照年龄进行排序,可以作为参考。
总结实现过程中的难点:
1.传参类型的确定,需要你深刻理解上面提到的设计思路
2.分装函数去实现比大小、以及交换的功能
指针概念总结 第10篇
野指针就是指针指向位置是不可知的(随机的,不正确的,没有明确限制的)。
1、指针为初始化
如以下C代码
2、指针越界xxx
如以下C代码
3、指针指向被释放的空间
如以下C代码
1、指针初始化 2、注意指针是否越界 3、指针指向被释放空间时置为NULL(空指针) 4、指针使用之前应检查其有效性
指针概念总结 第11篇
在指针这一章节中,会有各种各样的定义,指针、数组、函数,这三个词组在一起,让人看着觉得
复杂,但我们分析的时候,只要抓住本质,逐步分析,就能解决“如何定义”和“如何分析”两个问题
除此之外,更深一层是如何用这些指针去实现一些特有的操作,简而言之就是
要学会“如何看懂”、“如何定义”、“如何运用”
定义:
返回类型 (*指针名称)(函数参数类型)
定义:数组内函数的返回类型 (*p【数组大小】)(数组内函数的参数类型)
ps:在定义函数指针数组的时候有些许复杂,这里有个小技巧,你先定义一个函数指针
int(*p)(int,int) 》 int(*p【】)(int,int)
定义好后你想,本质是个数组,那么我应该人p和【】先结合,因此在p后面加个【】
找本质,本质部分去除后看类型,这个不难,就是多找几个练就熟了
函数指针无非就是将函数的地址取出来,通过地址去调用函数
函数指针数组用于存放这些函数指针
这两个结合,我们通常应用就是将同类功能的函数分开实现,统一放到一个数组里,方便调用
例如:计算器的实现
思路:我们讲加减乘除四个函数分别实现,再统一用个函数指针数组储存调用
代码:略