再谈指针--看不懂扇我

    之前已经了解过了指针的基本用法~~但是我总忘记又总结了一篇,内容没有比之前增加多少~~~~~只为加强对内容的理解~~

Csdn

目录

 

📍指针的含义

📍字符指针

❓Consider:

exception:const 修饰的指针变量

✨Summary:

📍指针数组

📍数组指针

    ✨Summary:

📍函数指针

📍函数指针数组

✨Summary:


📍指针的含义

  • 所谓指针及是一个变量,用来存放元素的地址,但是这里我把它理解为它是指向一块地址空间的。这样感觉更贴切一些。
  • 指针是个变量就会有大小,在32位机器下大小为4个字节,64位机器下大小为8个字节。
  • 通过对指针的解引就可以访问到指针所指向那块空间的内容。
  • 指针的类型决定了对指针+-的步长,包括指针的运算。

📍字符指针

字符指针就是指向字符型数据的指针

int main()
{
char c = '2';
	char* p = &c;
	cout << c <<" "<< *p<< endl;
	return 0;
}

字符指针一般使用形式。那么除了这个指针还有一个指向字符数组的指针。

字符数组的指针和这个就有些差别。

❓Consider:

为什么里面的内容相同两个比较却不一样呢?

这就和计算机对数据存储形式有关了。看下面这张图👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

     这便是我们在定义变量和申请空间时变量或者指针存放的地址~字符和数组和整型数组数组名字都是首元素变量的地址~~所以这两个字符数组在比较的时候比较的地址而非元素,因为里面的字符常量是放在代码段的。

exception:const 修饰的指针变量

    关于const修饰的变量可以分为两种情况:

Case1:const 放在*左边:

    example:

int main()
{
	int a = 10;
	int b = 20;
	const int* p = &a;
	*p = 50;
	cout << *p << endl;
	cout << a << endl;
	return 0;
}

   

     我们使用了const来修饰指针p那么这个const的作用就是*p不可再被赋予其他值,也就是不可以再通过这个const指针来修改这块空间的内容。但是可以通过其它方式来修改~~~

Case2:const放在*右边

    example:

int main()
{
	int a = 10;
	int b = 20;
	int* p = &a;
	p = &b;
	cout << *p << endl;
	return 0;
}

     

    这样的作用就是p指针的指向不可以再去修改了,意思就是你这个指针已经不能再乱☞了。这样编译器会报错的!但是指针所指向的那块空间的内容还是可以被改变的~~~~

✨Summary:

    const 修饰谁谁就不可以再被改变了~~~~

📍指针数组

    指针数组先了解其意思就是存放指针的数组,其定义形式为 int*ptr[ ];那么它的意思就是 首先我为一个数组,然后我里面放了指针变量~~

int main()
{
	char a[] = "abcd";
	char b[] = "bcde";
	char c[] = "cdef";
	char* ptr[] = { a,b,c };
	cout << ptr[0] << endl;
	cout << ptr[1] << endl;
	cout << ptr[2] << endl;
	return 0;
}

     我们之前说过的字符数组名称相当与首元素地址,那么它就相当于一个指针,我们通过一个数组来存放指针,然后遍历它~~~

📍数组指针

    数组指针和指针数组不同的是,它时指向数组的指针~~~

int main()
{
	int arr[2][5] = { { 1,2,3,4,5 },{5,4,3,2,1} };
	int(*p)[5] = arr;
	cout << **(p+1) << endl;
	return 0;
}

    首先他为一个指针,这个指针指向了一个里面含有五个元素的数组中,每个元素为int型。我们就可通过数组指针来遍历二维数组里面的每个数据~~

Exception :我们看一段代码👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

     

 我们前面已经说到数组名称就是首元素地址那么&数组名也相当于取出了首元素的地址么?

但是下面分别+1后的结果是不一样的,这里要清楚的时&数组名取出的是整个数组的地址,那么&数组名其实就是int(*p)[ ]的行为~~

int main()
{
	int arr[2][5] = { { 1,2,3,4,5 },{5,4,3,2,1} };
    //这里相当于取到了二维数组第一行的地址~~
	int(*p)[5] = &arr[0];
    //第一行的地址+1会跳到第二行,解引用拿到第二行首元素的地址+1再解引用得到第二行
    //第二个元素~~其实就相当于p[i+1][j+1];
	cout << *(*(p+1)+1) << endl;
	return 0;
}

    ✨Summary:

    数组指针在多维数组中应用是非常普遍的~就像平时我们使用的二维数组传参就是把数组指针传了过去~~形式参数也可以使用数组指针接收·~~~

    关于一级指针传参和数组传参这里不做过多介绍~~如果是一级指针传参,需要改变一级指针指向的内容那么就使用二级指针接收~~~

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

📍函数指针

    我们已经了解到了有整形指针~字符指针~指针数组~数组指针~这里我们介绍一个函数指针

顾名思义他就是指向函数的指针~~~

Example:

int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int(*p)(int ,int) = Add;
	int sum = (*p)(1, 6);
	cout << sum << endl;
	return 0;
}

    定义了以上代码段~~那么int(*p)(int,int)其意思就是首先为一个指针,指向了一个函数,函数里面的参数为两个int型参数~~返回值也为int型·通过以上这个函数指针使用我们就很好调用了这个函数~~

📍函数指针数组

    函数指针数组的用途是存放函数指针的数组~,它的定义方式为~~int(*p[ ])() ~~ 前面的int是函数指针返回的类型~~

我们可以通过函数指针数组来实现一个非常方便的计算器👇👇👇👇👇👇👇👇👇👇👇👇👇

void menu()
{
	cout << "*************************" << endl;
	cout << "******1.Add    2.Sub*****" << endl;
	cout << "******3.Mul    4.Div*****" << endl;
	cout << "******0.Exit   **********" << endl;
}
int Add(int x,int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
int main()
{
	int n = 0;
	do
	{
		menu();
		cout << "请选择:>" << endl;
		cin >> n;
		int(*p[5])(int ,int) = {0,Add,Sub,Mul,Div };
		if (!n)
		{
			cout << "退出!" << endl;
			break;
		}
		else if (n >= 1 && n <= 4)
		{
			int a, b;
			cout << "输入两个操作数:>";
			cin >> a >> b;
			int ans = p[n](a, b);
			cout << ans << endl;
			continue;
		}
		else
			cout << "输入错误,重新输入~" << endl;
		continue;
	} while (n);
		return 0;
}

✨Summary:

    每次总结完博客,都是感觉心有余而力不足,和我一起上课的同学们感觉他们什么都会唉~

这回事科班和非科班的差距么~🔨

还有一些关于指针来练习的习题在下面链接~~~

指针练习

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值