1.下标引用
int array[10];
int ap = array + 2;
说明:
ap[0]:C的下标引用和间接访问表达式是一样的, 对等的表达式是(ap + (0)),即array[2]
ap+6:对等的表达式是array+8或&array[8]
*(ap + 6):= array[8] = ap[6]
ap[-1]:ap指向第3个元素,使用偏移量-1使我们得到它的前一个元素即array[1]
2.指针的效率
当根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码;
声明为寄存器的指针通常比位于静态内存和堆栈中的指针效率更高;
3.数组和指针
数组和指针并不是相等的,都具有指针值,都可以进行间接访问和下标引用操作;
*区别:
声明数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量,指向这段空间的起始地址。
声明指针变量时,只为指针本身保留内存空间,它并不为任何整型值分配内存空间,指针需要人为对其进行初始化。
4.字符数组的初始化
char message1[] = “Hello”;
char *message2 = “Hello”;
前者初始化一个字符数组的元素,而后者则是一个真正的字符串常量
5.指向数组的指针
int vector[10], *vp = vector;
int matrix[3][10], *mp = matrix;
第1个声明是合法的,为一个整型数组分配内存,并把vp声明未一个指向整型的指针,vector和vp具有相同的类型,指向整型的指针。
第2个声明是非法的,matrix和mp不具有相同的类型,matrix并不是指向整型的指针,而是一个指向整型数组的指针
正确的用法:
int (*p)[10] = matrix;使p指向拥有10个整型元素的数组的指针(下标引用的优先级高于间接访问,所以要加括号)
6.作为函数参数的多维数组
作为函数参数的多维数组名的传递方式和一维数组名相同,实际传递的是个指向数组的第1个元素的指针,但是两者之间的区别是多维数组的每个元素是另外一个数组。
声明:
int matrix[3][10];
func2(matrix);
这里参数matrix的类型是指向包含10个整型元素的数组的指针
func2正确的声明:
void func2(int (*mat)[10]);
void func2(int mat[][10]);
错误的声明:
void func2(int **mat);
错误的原因:把mat声明为一个指向整型指针的指针,它和指向整型数组的指针并不是一回事。
第一种形参为二维数组
声明
void function(int a[m][n]);//函数声明
void function(int a[][n]);//不论多少维数组,第一维都可省略。
//凭什么,第二维就不可省略呢?由编译器的寻址方式决定。
调用
function(a);//函数调用 实参直接写数组名!数组名!(重点)。
//(注意)function(a[m][n])或function(a[][n])都不可以!
//话说,写数组名多好,简单轻松。
在函数操控元素
- *(a[i] + j) //代表第 i 行 第 j 列
- ((a+i) + j) //同上
- *((int )a +in +j )//同上,n表示第二维数组长度,即列宽
//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。
第二种形参为数组指针
(其实只是 声明定义 与第一种不同,其他一样)
声明
void function(int (*a)[n]);
//不是(int *a[n])(指针数组) ,而是(int (*a)[n])(数组指针);
// 缘由是 [] 的 优先级比 *的大
调用
function(a);//函数调用 实参同样直接写数组名!
//(注意)function(a[m][n])或function(a[][n])同样都不可以!
在函数操控元素
- *(a[i] + j) //代表第 i 行 第 j 列
- ((a+i) + j) //同上
- *((int )a +in +j )//同上,n表示第二维数组长度,即列宽
//a[i][j]不被允许。由编译器的寻址方式决定。
第三种形参为二级指针
声明
void function(int **a,int n);n表示第二维数组长度,即列宽
调用
function( (int **)a,int n);//实参不能为数组名!与上面相反!有两个 * !
//(注意)function(a)或function((int )a)不可以!
在函数操控元素
((int )a +in +j )//只有一种!n表示第二维数组长度,即列宽
//其他不被允许。由编译器的寻址方式决定。
总结
声明定义(分三种)。
二维数组,数组指针,二级指针。(都是指针)
调用(一对一,二对二)
数组指针,二维数组就写一级指针即 数组名.
二级指针就写二级指针即 (int)数组名
在函数中操作元素(注意二级指针,只能用最后的方法)
*(a[i] + j) //代表第 i 行 第 j 列
*( *(a+i) + j) //同上
*( (int * )a +i * n +j )//n表示第二维数组长度(列宽)
也就是说 3. 是万能的。
7.指针数组
int *api[10];
下标引用的优先级高于间接访问,api是某个类型的指针,在取得一个数组元素之后,随即执行的是间接访问操作,对数组的某个元素执行间接访问操作后,得到一个整型值,所以api肯定是有个数组,它的元素类型是指向整型的指针。
1390



被折叠的 条评论
为什么被折叠?



