指针进阶(一)(跑路人笔记)

文章目录

  • 前言
  • 字符指针
    • 字符指针的创建
      • 一些无关话题
    • 字符指针的知识以及与字符数组的比较
      • 不同点一
      • 不同点二
  • 数组指针
  • 指针数组
    • 指针数组的建立
  • 函数指针
    • 函数指针的创建
  • 函数指针数组
    • 函数指针的创建
  • 指向函数指针数组的指针
    • 指向函数指针数组的指针的创建
  • 总结

前言

请添加图片描述

大家好!!!期末考试搞完了重操旧业来搞一下最重要的指针进阶。这个作为最重要的知识我准备多搞几期,这一期将指针进阶的基础知识如❀❀指针类型和指针的创建和有关指针的知识❀❀,❀❀后面讲题目和使用方法❀❀。
那我们就开始吧!!
(PS:本章知识有些杂且难理解博主看视频时也是经过了反复的思考才终于有些理解所以没看懂的同学不要因此气馁)

字符指针

字符指针的创建

int main(void)
{
	char a = 'w';
	char *pa = &a;
	return 0;
}

pa就是我们的字符指针了他的类型是char*(无关话题的讨论点)然后pa为他的指针名在后续操作中使用pa就是直接对a内存的使用。

一些无关话题

虽然是char类型的指针但是类型中的一般和变量名相结合后续我们将函数指针和数组指针(本文就有)是会再次强调。

字符指针的知识以及与字符数组的比较

字符指针内存放的是内存所以我们可以将字符串赋值给我们的字符指针它就会存放字符串首元素的地址如下:

int main()
{
	char *pa = "abcdefg";
	return 0;
}

pa中存的就是a的地址,当然pa本身也是变量也有属于他的地址所以pa != &pa 两者是属于两码事
指针进阶(一)(跑路人笔记)_第1张图片
可以看到&pa 和pa 的不同 而且pa+1和&pa+1的跳跃跨度也不同所以千万不要把这俩搞混。可以将pa类比为存放字符串数组的变量但又不完全相同
下面是不同点的讲解(可能没有完全覆盖遗漏的点希望可以得到补充)

不同点一

(初始化赋值的不同)
如:

int main()
{
	char *pa = "abcdef";
	char arr[] = "abcdef";
	return 0;
}

虽然pa 和arr都是存储的首元素地址但如果在初始化时对pa进行赋值pa的内容将不能被更改arr则可以如下图:
指针进阶(一)(跑路人笔记)_第2张图片
这是因为我们在初始化字符指针赋值时对其赋值的是常量字符串常量不可再次被改变。而对字符数组内依旧是变量可以改变。
而对另一个字符指针再次赋值字符串他们这两个字符串相同这两个字符指针也相同
如下图:
指针进阶(一)(跑路人笔记)_第3张图片
两者完全相同。自然两者均无法改变。

不同点二

(对变量名取地址的不同)
如&pa 和&arr
详解:

int main()
{
	char arr[20] = "abcdefg";
	char* pa = arr;
	return 0;
}

指针进阶(一)(跑路人笔记)_第4张图片
可以看到pa 和 arr 同作为数组名指向的内容相同且*(pa+1) *(arr+1)内容依旧相同但是&pa 和&arr是两回事
看图
指针进阶(一)(跑路人笔记)_第5张图片

他们所指内存不同其实连类型都不再相同
&pa的类型为char * 为二级数组——指向一级指针的地址。(可以理解为套娃)
&arr的类型为char(
)[20]是数组指针
请添加图片描述
数组指针没看懂的同学下面会有讲解,我们现在可以将它理解成指向整个数组的指针。

数组指针

数组指针我们将它理解为指向数组的指针在此之前我们不妨理解一下
&arr 和 arr之间的区别
其实区别很明显:跳跃跨度不同
看图:指针进阶(一)(跑路人笔记)_第6张图片
我们的arr+1操作后就只跳跃了一个字节长度(因为是char类型)而我们的&arr+1则跳跃了一个数组的大小。
我们的数组指针就是指向&arr的指针
他继承了&arr相同的跳跃能力
创建方法:
指针进阶(一)(跑路人笔记)_第7张图片
使用时我们可以将其当做二维指针使用pa[0][10]就指向arr[10]
pa[0][10]等价与*(*(pa+0)+10)

指针数组

顾名思义这是一个数组
不过这个数组的元素是指针

指针数组的建立

int main()
{
	char* arr[20] = { 0 };
	return 0;
}

要注意的点是他的类型和数组指针类型很像
不过要区分也很简单我们只要记住:
变量名和 * 结合的是指针如数组指针就是将 *和变量名结合如char(*pa)[10],这就创造了一个指向10空间数组的指针。
而指针数组
的创建是char *pa[10]这就是创建了一个10个大小的指针数组。
(指针数组可以将相同类型的指针进行打包在传参时又可以节省很多空间)

函数指针

函数也有他的存储地址
指针进阶(一)(跑路人笔记)_第8张图片
Add和&Add两者除类型不同之外,在使用中几乎没有不同。

函数指针的创建

指针进阶(一)(跑路人笔记)_第9张图片

函数指针数组

数组是一个存放相同类型数据的存储空间。
我们已经学习了指针数组,我们类比一下指针数组就可以理解函数指针数组了

函数指针的创建

指针进阶(一)(跑路人笔记)_第10张图片
与函数指针类似在数组名后加上数组大小即可。

指向函数指针数组的指针

我们把函数都打包到函数指针数组我们传递给其他函数时我们依旧需要函数指针数组的指针。
(其实无论是函数指针数组还是指向函数指针数组的指针都是函数数组和函数数组指针的特殊形式而已。)

指向函数指针数组的指针的创建

void test(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	//函数指针pfun
	void (*pfun)(const char*) = test;
	//函数指针的数组pfunArr
	void (*pfunArr[5])(const char* str);
	pfunArr[0] = test;
	//指向函数指针数组pfunArr的指针ppfunArr
	void (*(*ppfunArr)[5])(const char*) = &pfunArr;
	return 0;
}

与变量名结合那么这个变量就是指针
当变量名旁有**[ ]时我们的变量名会优先与[ ]结合所以我们要创建指向函数指针数组的指针**时我们需要将变量名和
括在一起。

总结

指针进阶远远不止这些博主也不知道会出多少期关于指针进阶。
但作为C语言最重要也最难的内容博主认为出他个7 8 期都是合理的。
OK结束
下一期我会在此理解指针并讲解一下指针的题目。

你可能感兴趣的:(c++,c语言,开发语言)