目录
一、字符指针
在指针的类型中我们知道有一种指针类型为字符指针 char*
int main()
{
const char* pstr = "hello bit.";
printf("%s\n", pstr);
return 0;
}
很多同学以为是把字符串
hello bit 放到字符指针 pstr
里了,但是
本质是把字符串
hello bit的首字符的地址放到了
pstr
中。
那下面的这道题的结果又是什么呢?
#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;
}
这里
str3
和
str4
指向的是一个同一个常量字符串。
C/C++
会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化 不同的数组的时候就会开辟出不同的内存块。所以str1
和
str2
不同,
str3
和
str4
不同。
二、数组指针
指针数组是一个存放指针的数组。
int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组
三、指针数组
数组指针本质上还是指针。
我们已经熟悉:
整形指针: int * pint
; (
能够指向整形数据的指针)。
浮点型指针: float * pf
; (
能够指向浮点型数据的指针)。
那数组指针应该是:能够指向数组的指针。
下面代码哪个是数组指针?
int *p1[10];
int (*p2)[10];
答案是:int (*p)[10];
解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个 指针,指向一个数组,叫数组指针。
注:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
四、函数指针
函数指针本质上是指针。
首先看一段代码:
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
输出的是两个地址,这两个地址都是 test 函数的地址。
那我们的函数的地址要想保存起来,怎么保存?
void test()
{
printf("hehe\n");
}
int mian()
{
void (*ptest2)() = &test;
return 0;
}
解释:pfun1
先和
*
结合,说明
pfun1
是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void
。
五、函数指针数组
数组是一个存放相同类型数据的存储空间,那要把函数的地址存到一个数组中,这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
int (*parr1[10])();
int *parr2[10]();
int (*)() parr3[10];
答案是:
parr1
parr1
先和
[ ]
结合,说明
parr1
是数组,数组的内容是什么呢?
是
int (*)()
类型的函数指针。
六、指向函数指针数组的指针
指向函数指针数组的指针是一个
指针,指针指向一个数组,
数组的元素都是
函数指针。
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
void (*pfun)(const char*) = test; //函数指针pfun
void (*pfunArr[5])(const char* str); //函数指针的数组pfunArr
pfunArr[0] = test;
void (*(*ppfunArr)[5])(const char*) = &pfunArr; //指向函数指针数组pfunArr的指针ppfunArr
return 0;
}