C语言指针这一篇够了(一万二千字,包含指针与数组,函数指针等详解)

您所在的位置:网站首页 gshock5535指针跟时间对不上 C语言指针这一篇够了(一万二千字,包含指针与数组,函数指针等详解)

C语言指针这一篇够了(一万二千字,包含指针与数组,函数指针等详解)

2024-01-25 08:38| 来源: 网络整理| 查看: 265

目录

零.前言

一.指针的定义

二.指针类型的意义

1.指针类型决定了指针解引用时一次访问几个字节。

2.指针类型决定了指针加减整数时的步长

三.野指针

1.未初始化的指针

 2.指针的越界访问

3.指针指向空间的释放

四.指针运算

1.指针加减整数

2.指针减去指针

3.指针比较大小

五.指针与数组

1.数组名

(1)当与sizeof()结合的时候

(2)当&数组名时

2.用指针操作数组

3.指针数组

4.数组指针

(1)数组指针与指针数组的区别

(2)数组指针的使用

5.总结

1.区分概念

2.一维数组传参

3.二级指针传参

六.二级指针

七.字符指针

1.第一种形式

2.第二种形式

八.函数指针

1.函数的地址

2.函数指针

 1.函数指针的定义​

 2.函数指针的解引用

3.函数指针的两个复杂的例子

3.函数指针的应用

3.回调函数

1.定义

2.qsort函数(void*)

4.指向函数数组指针的指针

九.总结

零.前言

相信很多小伙伴学c语言的时候都是谈‘针’色变呀,我当年学的时候也可谓之吃力,因此写了这篇文章,希望帮助更多的在指针的剥削下瑟瑟发抖的同学们彻底攻克这一烦人的内容,让指针的压迫成为过去时,让更多的同学看完这篇文章后可以对着指针大喊:我!站起来了!

一.指针的定义

指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。

int a=10; //定义一个变量a int* pa=&a;//定义一个指针pa指向a *pa=9; //通过对指针的解引用修改a的值

其中修改a的值得过程与 a=9 等价。

注意两个‘*’的意义不同,第一个‘*’是与int连用的,表示指针类型是(int*),第二个'*'是解引用操作符。

二.指针类型的意义

在32位机器中,每一个指针的大小都是四个字节,直接给指针一个统一的类型比如ptr*不香吗?那为什么还要有像(int*),(char*)等指针类型的区分呢,下面介绍指针类型的意义。

1.指针类型决定了指针解引用时一次访问几个字节。 int a = 0x11223344;

首先我们定义一个16进制的数字a。

我们先找到a的地址,然后给他赋值,在内存中观察到的是这样的。

此时a的地址时0x0095F8FC,可以看到已经将16进制数字0x11223344放入了a中。

下面我将用不同类型的指针分别修改a的值,我们可以看看内存中a的值得变化效果。 

 1.int* 定义的指针

int* pa=&a; *pa=10;

当执行完*pa=10之后,a中放的内容为

 可以发现a的四个字节都发生了改变,并且这四个字节组成的数字是10。

2.char*定义的指针

char* pa=&a; *pa=10;

 最后a的值是这样的

我们会发现只改变了一个字节的内容,改动的那个字节被赋值成10,但a的值并不是10。

总结一下就是int*型指针在解引用修改指向值时,修改的是和整型一样大小的4个字节的内容,而char*型指针在解引用修改指向值时修改的是和字符型一样大小的1个字节的内容。

2.指针类型决定了指针加减整数时的步长 int a = 10; int* pa = &a; char* pb = &a; printf("%p\n", pa); printf("%p\n", pb); printf("%p\n", pa + 1); printf("%p\n", pb + 1);

 这个代码的输出结果是

我们发现int*型指针+1后的结果多了4个字节,但char*型指针+1后的结果只多了1个字节。

三.野指针 1.未初始化的指针 int *p; *p=10;//编译器会报错  2.指针的越界访问 int arr[10]; int i; int*p=arr;//数组名表示数组首元素地址 for(i=0;i&arr[0];) { *--p=0; }//由于是后置--,并没有对arr[10]进行操作,所以可以这样使用

其中p>&arr[0]为对指针的关系运算。

五.指针与数组

数组:一块连续的空间,存放的是相同类型的元素,数组的大小与元素类型和个数有关。

指针:是一个变量,存放地址,大小是4(32位机器)或者8个(64位机器)byte。

1.数组名

数组名大多数情况表示的就是首元素地址。

int arr[10]={0}; printf("%p",arr); printf("%p",&arr[0]);

这两段代码打印的结果是相同的,说明数组名表示的是首元素地址。

但是有两个特例

(1)当与sizeof()结合的时候 int arr[10]={0}; int sz=sizeof(arr)/sizeof(arr[0]);//10

这段代码打印的结果是10,当sizeof与数组名结合的时候数组名表示整个数组。sizeof(数组名)表示的是整个数组所占的字节数。

(2)当&数组名时 int arr[10]={0}; printf("%p\n",arr); printf("%p\n",&arr); printf("%p\n",arr+1); printf("%p\n",&arr+1);

打印出来的结果是这样的,打印出来的arr和&arr是一样的,但是+1之后,arr加了4个字节,但是&arr加了40个字节,说明 &arr中的arr表示的是整个数组。

2.用指针操作数组

这里只是另一种操作数组的方式。

int arr[10]={0}; int* p=arr; int i; int sz=sizeof(arr)/sizeof(arr[0]); for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3