1.字符指针变量
我们有一种指针类型为字符指针char*
内容相同的常量字符串存放一份就够了(C语言会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存)
数组名表示数组首元素的地址
str1和str2分别表示h的地址,str1和str2是两块不同的空间,所以h的地址不同
即str1和str2不相等
(比较的是存的地址是否相等)
2.数组指针变量
2.1
指针数组 ----是数组,存放的是指针(地址)
字符指针 ----char*--指向整型的指针----字符指针变量中存放字符变量的地址
char ch = 'w';
char * pc = &ch;
整型指针 ----int * --指向整型的指针----整型指针变量中存放整型变量的地址
int a = 10;
int * p = &a;
数组指针 ----指向数组的指针 ----数组指针变量中存放数组的地址(&数组名)
p旁边放一颗 * ,说明它是指针 (*p)
int arr [10] int (*p)[10]
数组名去掉就是数组类型 int [10] 指针变量去掉就是指针类型 int (*)[10]
2.2 int *p1[10]和int (*p2)[10]
char * ch[5];
char * (*pc)[5] = &ch;
指针数组 数组指针
数组 指针
存放指针的数组 是指向数组的指针
char * arr[6]; int (*p)[10];
int * arr[5]; p就是数组指针,p指向的数组有10个元素,每个元素的类型是int
2.3数组指针变量初始化
int arr[10]={0};
&arr;//&数组名,得到的就是数组的地址
int (*p)[10]=&arr;
3.二维数组传参的本质
一维数组传参
数组名是数组首元素的地址,一维数组传参的时候,传递的是数组首元素的地址
函数的参数既可以写成数组的形式,也可以写成指针的形式
不管是一维数组还是二维数组,形参既可以写成数组也可以写成指针
4.函数指针变量
4.1函数也有地址-----函数指针变量是存放函数的地址的,通过地址能够调用函数
函数名就是函数的地址,也可以通过&函数名的方式获得函数的地址
函数名和&函数名是一样的,都是函数的地址,没有区别,但&数组名和数组名是不同的
4.2
4.3
4.4typedef关键字
typedef是用来类型重命名的,可以将复杂的类型简单化int
1.将unsigned int重命名为uint
typedef unsigned int uint;
2.将指针类型 int * 重命名为ptr_t (新的类型名必须在 * 的右边)
typedef void(*pfun_t)(int);
3.数组指针类型 int (*)[5] 重命名为parr_t
typedef int(*parr_t)[5];
4.函数指针类型void(*)(int) 重命名为 pf_t
typedef void(*pfun_t)(int)
5.函数指针数组
把函数的地址放到一个数组中,那么这个数组就叫函数指针数组
从函数指针的基础上去写,存放多种类型的函数的地址
int (*parr1[3])(); parr1先和[ ]结合,说明parr1是数组,数组的内容是int (*)()类型的函数 指针(parr1)
int *parr2[3]();
int (*)() parr3[3];
函数指针数组的用途:转移表
计算器的实现