目录
六、函数的指针数组
七、函数指针数组的指针
八、回调函数
1.指针就是一个变量(指的是指针变量),指针是用来存放地址的,地址唯一标识一块内存空间。(也就是说,内存会划分为小的内存单元,每个内存单元都有一个编号,这个编号就被称为地址,也把地址叫做指针)。
2.指针的大小是固定的,在32位系统下是4个字节,在64位系统下是8个字节。
3.指针是有类型的,指针的类型决定了指针的+-整数的步长(+1或者-1会跳过几个字节),指针解引用操作的时候的权限。
一、字符指针
指针类型有一种类型为char*(字符指针)
一般情况下,我们将一个字符的地址存放在一个字符指针变量中
int main()
{
char ch = 'a';
char* pc = &ch;
*pc = 'a';
return 0;
}
pc就是一个指针变量,里面存放的是ch的地址,当我们对指针变量pc进行解引用,就可以的到我们的字符'a';
这个我们很容易理解,但是我们还有一种常用的写法,
#include<stdio.h>
int main()
{
const char* str = "hello";
printf("%s\n",str);
return 0;
}
在这里,我们就会想到,这是将一个字符串放在str的指针变量里了吗?
在这里,我们并不是将一整个字符串放在str的指针变量中了,而是将字符串的首字符的地址存放在了str中,当我们去向后访问时,访问到\n就访问结束。
#include<stdio.h>
int main()
{
char str1[] = "hello bit";
char str2[] = "hello bit";
const char* str3 = "hello bit";
const char* str4 = "hello bit";
if (str1 == str2)
{
printf("str1 and str2 are same\n");
}
else
{
printf("str1 and str2 are not same\n");
}
if (str3 == str4)
{
printf("str3 and str4 are same\n");
}
else
{
printf("str3 and str4 are not same\n");
}
return 0;
}
这里的运行结果应该是什么呢?
str1 str2是在内存中内存中开辟了两个空间,分别用来存储字符串str1 和 str2,因此str1!=str2。在str3 与 str4比较时,这里就需要注意了,这里是将hello bit这个字符串的地址分别存放在str3 和 str4中,因此这里str4 和 str3 是相同的。
二、指针数组
我们了解到数组,数组是一个存放相同类型元素的集合,我们之前学习到有
int* arr1[10];//整型指针数组
char* arr2[10];//字符指针数组
char* * arr3[10];//二级字符指针数组
指针数组,是一个用来存放指针的数组。
三、数组指针
1.数组指针的定义
当我们看到数组指针时,数组指针是数组还是指针?他应该是指针,也就是一个数组的地址,
int* p1[10];
int(*p2)[10];
在这里p1和p2分别是指的什么?
p1指的是一个整型指针数组,p1是一个数组,里面存放了10个int*类型的元素;
p2是一个指针,在这里表示p2是一个指针变量,P2指向的是一个大小为10的一个整型数组,p2因为指向一个数组,也是一个数组指针。
2.&数组名和数组名
在之前我们了解到,数组名是数组首元素地址,但是有两个情况例外,一个是将数组名在sizeof里面使用时,另一个就是&数组名,在这两种情况下数组名不代表数组首元素地址。
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}
上面一串代码,我们输出的时