- 1、本文档共60页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章指针与数组重点讲义
处理多维数组的列 二维数组a中第i列元素清零: int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i; … for (p = a; p a+NUM_ROWS; p++) (*p)[i] = 0; * p 用多维数组名作为指针 查找数组a[NUM_ROWS][NUM_COLS]最大元素: int find_largest(int a[], int n){ int i, max = a[0]; for (i = 1; i n; i++) if (a[i] max) max = a[i]; return max; } 调用: largest = find_largest(a, NUM_ROWS * NUM_COLS); /* WRONG */ a类型: int(*)[NUM_COLS] 而find_largest希望接受是int * * 用多维数组名作为指针 正确调用: largest = find_largest(a[0], NUM_ROWS * NUM_COLS); a[0]指向a[0][0](类型int *) 结论:以数组为形参的函数,本质上以类型相同的指针来处理 * 指针和变长数组 (C99) 指针可以指向变长数组 (VLAs)中的元素 常规的指针变量可用于指向一维变长数组中的元素 void f(int n) { int a[n], *p; p = a; … } * 指针和变长数组 (C99) 如果变长数组是多维的,则指针的类型取决于除第一维外每一维的长度。 下面是一个二维的例子: void f(int m, int n) { int a[m][n], (*p)[n]; p = a; … } 因为指针 p 的类型取决于 n,而n不是常量,因此称p具有可变类型。 * 指针和变长数组 (C99) 注意:编译器并非总能确定赋值语句p = a的合法性。 例如:下述语句可以通过编译,但只有当m 等于n时结果才是正确的: int a[m][n], (*p)[m]; p = a; 如果 m 不等于 n,则后续对指针p 的使用都将导致未定义的行为。 * 指针和变长数组 (C99) C99对可变类型赋予了一些限制条件。 最重要的限制是:可变类型的声明必须出现在函数体的内部,或者在函数原型中。 * 指针和变长数组 (C99) 对变长数组同样可以执行指针算术运算。 例如对于如下的二维变长数组: int a[m][n]; 可以声明一个指针p,指向 a中的某一行: int (*p)[n]; 下述循环语句可以将数组 a第i列元素清零: for (p = a; p a + m; p++) (*p)[i] = 0; * * * 和 ++ 运算符的组合 最常见组合*p++,在循环中十分方便 先取当前元素,再后移指针,与a[i++]同 例如:对数组a求和 for (p = a[0]; p a[N]; ) sum += *p++; 可以改写为: p = a[0]; while (p a[N]) sum += *p++; * * 和 ++ 运算符的组合 * 和 --组合类似于* 和 ++的组合 “栈”例: 整型变量top跟踪contents数组“栈顶” 指针变量top_ptr替换top,初始指向contents数组的第零个元素: int *top_ptr = contents[0]; = contents;? * * 和 ++ 运算符的组合 新的 push 和 pop 函数: void push(int i) { if (is_full()) stack_overflow(); else *top_ptr++ = i; } ? int pop(void) { if (is_empty()) stack_underflow(); else return *--top_ptr; } * contents top_prt 栈底 栈顶生长方向 用数组名作为指针 数组与指针关联关系: 数组名本质上是数组(首元素)地址 数组名可当做指针使用 指针算术运算 * 用数组名作为指针 声明数组: int a[10]; 以指针方式使用数组名: *a = 7; /* a等价于a[0]*/ *(a+1) = 12; /* a[1]=12 */ a + i 和 a[i]等同 *(a+i) 与 a[i]也等同 * 用数组名作为指针 数组名作指针,编写遍历数组循环更加容易: for (p = a[0]; p a[N]; p++)
您可能关注的文档
最近下载
- 2025款比亚迪宋PLUS EV豪华尊贵旗舰型_用户手册驾驶指南车主车辆说明书电子版.pdf VIP
- 第1课《初三,我来了》课件北师大版心理健康教育九年级全一册.ppt
- 2023全域用户经营白皮书:STAR模型,从用户运营到生意增长.doc VIP
- NBT 35042-2014 水力发电厂通信设计规范.pdf
- 《小学英语单元整体作业设计的实践研究》开题报告.docx VIP
- “三个聚焦”内容个人自查报告.docx VIP
- 2024年充电宝市场现状分析:充电宝全球市场销售额达到224亿元.docx
- 各种烟气焓温、密度、比热计算表.xls VIP
- 考试妇科试题.docx VIP
- 德国科技创新与产业趋势.pptx VIP
文档评论(0)