之前已经了解过了指针的基本用法~~但是我总忘记又总结了一篇,内容没有比之前增加多少~~~~~只为加强对内容的理解~~
目录
📍指针的含义
- 所谓指针及是一个变量,用来存放元素的地址,但是这里我把它理解为它是指向一块地址空间的。这样感觉更贴切一些。
- 指针是个变量就会有大小,在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:
每次总结完博客,都是感觉心有余而力不足,和我一起上课的同学们感觉他们什么都会唉~
这回事科班和非科班的差距么~🔨
还有一些关于指针来练习的习题在下面链接~~~