指针和数组
int *p[10]
int (*p)[10]
int *p(int)
int (*p)(int)
- int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。
- int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。
- int *p(int)是函数声明,函数名是p,参数是int类型的,返回值是int *类型的。
- int (*p)(int)是函数指针,强调是指针,该指针指向的函数具有int类型参数,并且返回值是int类型的。
数组名和指针(这里为指向数组首元素的指针)区别?
- 二者均可通过增减偏移量来访问数组中的元素。
- 数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。
- 当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。
你知道数组和指针的区别吗?
- 数组在内存中是连续存放的,开辟一块连续的内存空间;
- 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量
- 在向函数传递参数的时候,如果实参是一个数组,那用于接受的形参为对应的指针。也就是传递过去是数组的首地址而不是整个数组,能够提高效率;
- 在使用下标的时候,两者的用法相同,都是原地址加上下标值,不过数组的原地址就是数组首元素的地址是固定的,指针的原地址就不是固定的
函数指针?
- 什么是函数指针?
- 函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。
- 函数指针的声明方法
int (*pf)(const int&, const int&);
- pf就是一个函数指针,指向所有返回类型为int,并带有两个const int&参数的函数
- 为什么有函数指针
- 函数与数据项相似,函数也有地址
- 希望在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果
- 一个函数名就是一个指针,它指向函数的代码。
- 两种方法赋值:
- 指针名 = 函数名
- 指针名 = &函数名