一、指针运算 给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。 int main() {char a = 1;int b = 1;int arr[10] = { 0 };char* pa = a;int* pb = b;int(*parr)[1
一、指针运算
给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。
int main() {
char a = 1;
int b = 1;
int arr[10] = { 0 };
char* pa = &a;
int* pb = &b;
int(*parr)[10] = &arr;
printf("%p\n", pa );
printf("%p\n", pa + 1); //相差1
printf("%p\n", pb);
printf("%p\n", pb + 1); //相差4
printf("%p\n", parr);
printf("%p\n", parr + 1); //相差40
return 0;
}
二、字符指针(char*)
char*用于存储char型变量的地址
1.通过字符指针创建常量字符串
以下是三种打印字符串的方式
int main() {
//第一种
char arr[] = "hello world";
printf("%s\n", arr); //arr末尾隐藏\0,打印时读取到\0结束
//第二种
char* p1 = arr;
printf("%s\n", p1);
//第三种
char* p2 = "hello world";
printf("%s\n", p2);
return 0;
}
其中第一二种为常规方式,重点分析第三种 ‘char* p2 = "hello world" ’,看似是把char型数组直接赋值给p2指针,实则不然,
因为char型指针最多存放4个字节,而hello world\0有12个字节。p2实际上是存储了首元素地址。
用第三种方式创建的字符串为常量字符串,无法被修改,最好用const加以修饰
2.例题(内容相同的常量字符串,在内存中唯一)
int main() {
char arr1[] = "abcdef";
char arr2[] = "abcdef";
char* p1 = "abcdef";
char* p2 = "abcdef"; //如果两个常量字符串完全相同,则其不会在内存中反复创建,只会创建一个,并且拥有唯一的地址
if (arr1 == arr2) //首元素地址不相同
printf("相等\n");
else
printf("不相等\n");
if (p1 == p2) //首元素地址相同
printf("相等\n");
else
printf("不相等\n");
return 0; //结果为不相等 相等
}
三、数组指针和指针数组
见数组和指针的碰撞
四、函数指针
1.函数指针的形式
以返回值为int,参数为(int,int)的add函数举例 (两变量相加的函数)
它的函数指针p写为:int(*p)(int,int)
int add(int a, int b) {
int z = a + b;
return z;
}
int main() {
int a = 2;
int b = 3;
int(*p)(int, int) = &add; //(*p)表示p的本质是指针,其余的int (int,int),表示函数的返回值为int型,传参类型为(int,int)
//int(*p)(int, int) = add 也可以行,函数名同样可以表示函数地址
printf("%d\n", (*p)(a, b));
printf("%d\n", p(a, b)); //p和(*p)都可以,因为函数名add <=> 函数的地址p
return 0;
}
2.例题
pfun1 可以存放test的地址,因为它的本质是函数指针,该函数的返回值类型为void,参数为()
pfun2本质是函数,返回值类型为void*,参数为()
五、函数指针数组
1.函数指针数组的形式
创建一个包含加减乘除函数的数组parr,可以写为int (*parr[4]) (int,int)
int add(int a, int b) {
int z = a + b;
return z;
}
int sub(int a, int b) {
int z = a - b;
return z;
}
int mul(int a, int b) {
int z = a * b;
return z;
}
int div(int a, int b) {
int z = a / b;
return z;
}
int main() {
int(*parr[4])(int, int) = { &add,&sub,&mul,&div };
for(int i=0;i<4;i++)
printf("%d\n", (*(parr[i]))(2, 3));
return 0;
}
函数指针数组用于存放函数类型相同的函数的地址
六、函数指针数组的指针
如果想要存储五中的parr这个指针函数数组的地址,我们可以创建函数指针数组的指针pparr,
写作:int(*(*pparr)[4]) (int, int)