本文共 1311 字,大约阅读时间需要 4 分钟。
《C Primer Plus》阅读笔记
一、指针与数组的表示方法
C语言中,ar[i]和* (ar+1)是等价的,无论ar是数组名还是指针变量都没问题。但只有当ar是指针变量时,才能使用ar++这样的表达式。指针表示法在处理数组时更灵活,尤其是在动态分配存储空间时更具优势。
int * p;声明一个指向int类型的指针,功能上与一维数组类似。通过* (p+i)可以对存储单元进行赋值,与数组表示法效果相同。指针表示法的优势在于可以动态分配存储空间,而数组则需要预先分配。以下是指针表示法的一维数组示例:
#includeint main(void) { int *p, i, n; scanf("%d\n", &n); for (i=0; i < n; i++) { // 读取输入并赋值 * (p + i) = ...; }}
数组形参的声明
int sum(int *ar, int n):函数接收数组首地址和长度。int sum(int ar[], int n):函数接收数组名和长度。int sum(int *str, int *end):可以分别传递数组的起始地址和结束地址,适用于处理更大范围的数组。指针的基本用法
指针的主要用途是函数间信息传递,尤其是需要修改主调函数变量时。常见场景是处理数组时,通过指针实现动态分配或多维数组操作。二、指针与多维数组
int a[3][4];这是一个主数组,包含3个元素,每个元素是内含4个int值的数组。a是主数组的首元素地址,与&a[0]相同。a[0]则是内含4个int值的数组的首元素地址,与&a[0][0]相同。通过指针解引用可以获取原始值:
* (* (a + 1) + 1) 表示二维数组第2个元素的第2个值。 int **a; a = (int**)malloc(sizeof(int*) * m);// 创建了一个m*n的二维数组,与`a[m][n]`等效。
指针与二维数组的关系
int a[3][4]; int (*b)[4];b = a;b声明为指向4个int值数组的指针,因为a是二维数组的首元素地址,而每个元素是一个内含4个int值的数组。二维数组与函数
函数参数中二维数组的表示:void sum(int a[][len], int row); // len不能省略void sum(int (*b)[len], int row); // len不能省略
这些函数接收数组的首地址和行数,适用于处理具有固定列数的二维数组。
转载地址:http://liqwz.baihongyu.com/