1.指针是什么
通俗的讲,指针就是地址,但严谨的说,指针是存放地址的指针变量。指针变量的大小在32位机器上为 4个字节,64位机器上为 8个字节。
动态内存分配:使用如malloc(C/C++)、new(C++/C#)等函数或操作符动态地分配内存,并通过指针来访问这些内存区域。
数组和字符串:在C/C++等语言中,数组名本质上是一个指向数组首元素的指针,字符串也通常通过字符指针(以null结尾的字符数组)来表示。
函数参数和返回值:通过指针,函数可以修改传递给它的参数的值,或者返回多个值。
数据结构和算法:在实现复杂的数据结构(如链表、树、图等)和算法时,指针是不可或缺的工具。
2. 指针类型的意义
+1/-1操作时跳过几个字节取决于指针类型,如 int* 类型跳过4个字节,char* 类型跳过1个字节。
解引用操作时的权限,解引用操作时访问几个字节的大小取决于指针类型
3. 指针的运算
(1)+ -整数,实现指针的偏移,指向其他元素
(2)指针 - 指针 ,得到的结果是两个指针之间元素的个数,而不是字节个数(指针 + 指针是非法的)
(3)指针的关系运算,就是用<、<=、> 和 >= 运算符来比较两个指针。
4.指针数组
指针数组就是一个存放指针变量的数组,数组里面的元素全都是指针变量。
例:int* arr[3] = {p1,p2,p3}; 里面的p1,p2,p3就是指针,类型为int*。
5.数组名是什么
数组名通俗的讲就是数组首元素的地址(特别注意数组名只是地址而不是指针),但也有例外情况
(1)sizeof 数组名(例 sizeof(arr)),这里的arr代表的是整个数组的地址,虽然它的地址还是和数组首元素的地址相等,但是它们的含义不同。
(2)&数组名(例 &arr),这里的啊让人代表的也是整个数组的地址
6.数组指针
数组指针就是指向数组的指针。
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr
注意这里的 * 不在表示解引用,而是告诉我们,这里的p是一个指针。加上括号()来防止p先和[3]结合。且这里要用整个数组的地址&arr,而不是首元素地址arr。
7.函数指针
函数也是有地址的,函数指针就是指向函数的指针
int Add(int x, int y)
{
return x + y;
}
int main()
{
int (*p)(int, int) = &Add;
int sum = p(2, 3);//通过函数指针使用函数
return 0;
}
这里p就是函数指针,它的类型为 int (*)(int, int) 。sum的值为5。
8.存放函数指针的数组
就是一个数组,里面存放的全都是函数指针(例 int (*parr[3])(int, int)),parr[3]就是一个函数指针数组,里面的每一个元素类型都是int (*)(int, int)。
9.回调函数
回调函数就是通过函数指针调用的函数,通俗的讲就是创建一个函数指针,在一个函数中,我通过函数指针调用了那个函数,那么函数指针指向的那个函数就是回调函数