字符指针
在指针类型中我们知道字符指针类型,一般就是用于 char 的:
int main()
{
char ch = 'w';
char* p = &ch;
*p = 'a';
return 0;
}
还有一种使用方法:
int main()
{
const char* pstr = "hello bit";
printf("%s\n", pstr);
return 0;
}
上述代码中放入指针 pstr 中的不是整个字符串,而是字符串首字符的地址放到了指针中,就是说字符 h 的地址放到了指针中。(如果字符串是表达式的话,他的值是首字符的地址)。
上述代码会输出什么?
因为用相同的常量字符串初始化不同的数组时会开辟出不同的空间,自然就不一样了,而 str3 和 str4指向的是同一个常量字符串,是同一个内存空间,所以是相同的。
指针数组
之前的文章有讲过
数组指针
数组指针是数组还是指针,答案是指针,是指向一个数组的指针。
我们看看数组指针是什么样子的:
int* p1[10];//指针数组
int (*P)[10];//数组指针
*先与p结合说明是指针,int [10]说明指向的是一个整形数组。
&数组名
之前知道数组名一般是首元素的地址,只有sizeof和&不是,当&数组名时,取出的是整个数组的地址,他的类型就是数组指针,+1跳过整个数组的大小。
数组指针的使用
数组指针一般有什么用,一般是二维数组传参的时候
二维数组传参可以写这两种方式,但是因为数组名是首元素的地址,二维数组的首元素地址是第一行的地址,也就是一个一维数组的地址,所以要用数组指针来接收。
特殊代码
int (*parr[10])[5];
请问这个代码的含义,来分析:
先将移去的看做是整体,可以看出剩下的是一个数组指针的类型,再看parr[10]有元素,说明这是一个数组,存放数组指针的数组。
特别提示二维数组传参的时候,函数参数中 [2][5] 第一个[]可以省略,第二个不可以。
函数指针
会输出什么
这两个地址都是函数的地址,函数地址该怎么保存?
void (*pfun1)();
//*先与pfun1结合说明是指针,指向的函数返回类型是void,()里没有参数
int (*pfun2)(int,int);
//指向的函数返回类型是int,参数类型是int,int
这就是函数指针类型。(同时我们知道了函数名就是函数的地址,函数指针可以直接用于函数调用)
特殊代码
(*(void (*) () )0) ();
void (*signal(int, void(*)(int) ) )(int);
先分析第一个代码:
被拿下的部分是函数指针类型,说明是一个类型转换,解引用类型转换之后的0,说明是调用0地址处的函数,没有参数。
第二个代码:
当移去部分后,剩下的是一个函数指针类型,再看移去的部分,像是一个函数声明,参数类型是 int和函数指针类型,说明这就是一个函数声明,参数有两个,返回类型是函数指针类型。