详解C 指针(Pointer)(数组指针)

您所在的位置:网站首页 pointer网站 详解C 指针(Pointer)(数组指针)

详解C 指针(Pointer)(数组指针)

#详解C 指针(Pointer)(数组指针)| 来源: 网络整理| 查看: 265

C 指针(Pointer) 指针基础指向数组的指针数组指针以及多重指针函数中的指针

开始新的内容前, 再巩固一遍* 获取指针所指的变量的值,& 获取变量所在的地址, * 对指针用, & 对变量用 再+一条 *和[]等效!!! (在二维数组中很能体现出来).

指向数组的指针

数组指针说明白点就是指向数组的指针,其本质还是基本指针,声明方式同基本指针.其中个人认为最中要的几点:

数组名即是指针 (也就是地址, 二维数组a[3[4]中, a[0]是第一行数组名).对指针进行pointer+1或--类似运算实际值由指针当前所属的类型决定. ( e.g.char类型的地址编号+1, int类型的地址编号+4 ).在后面的一维数组指针和二维数组指针中会进一步讲解*和[]等效, 等效, 等效!!! (在二维数组中很能体现出来).

牢记这几点, 在使用的时候多尝试, 多思考, 数组指针就快搞懂喽😎😎😎.

这里还是要把一维数组和二维数组分开讲

指向一维数组的指针

二话不说,先上例子代码, 我是觉得看例子很容易明白,

//数字一维数组 int numbers[] = {10, 2, 5, 7, 3, 30}; int * pointer_n = numbers; //创建指向数组的指针 printf("%d %d\n", numbers[1], numbers[2]); printf("%d %d\n", &numbers[1], &numbers[2]); printf("%d %d\n", *(numbers+1), *(numbers+2)); printf("%d %d\n", *(pointer_n+1), *(pointer_n+2)); printf("%d %d\n", pointer_n+1, pointer_n+2); /* 输出: 2 5 -441972732 -441972728 2 5 2 5 -441972732 -441972728 */ //字符一维数组 char a[] = "Wish a better life"; char * pointer_c = a; char * pointer_s = a; printf("%c %c\n", a[1], a[2]); printf("%d %d\n", &a[1], &a[2]); printf("%c %c\n", *(a+1), *(a+2)); printf("%c %c\n", *(pointer_c+1), *(pointer_c+2)); printf("%d %d\n", pointer_c+1, pointer_c+2); printf("%s\n", pointer_s); printf("%s\n", *pointer_s); /* 输出: i s -441972767 -441972766 i s i s -441972767 -441972766 Wish a better life zsh: segmentation fault ./Pointer */

对比着看很容易能看出*与[]的等效关系, 也很方便看出对指针进行+1运算的时候是对内存地址怎样操作. 看看例子, 再自己试试, 相信会有更深的理解. 要特别注意的是: 观察代码最后一行和倒数第二行的比较可以观察如果想用指针引用字符串应该传入的是指针而不是元素,C的编译执行会在找到指针(地址)之后自动+1直到字符串结束.

指向二维数组的指针.

二维数组指针和一维不一样的是多了一层数组名: a[0, a[1], a[2]分别是是0行1行2行的数组名 (即地址, 指针). 牢记*与[]等价, 之后仿照一维数组的操作就👌喽.先上图, 再上表格, 对比一看就了解喽.( 直接看教材也可, 《C程序设计(第五版)》谭浩强著.) 在这里插入图片描述

表示形式含义值a,a[0],*a,*(a+0)指向表格首元素的指针,即首元素的地址2000a[1],*(a+1),&a[1][0]指向1行0元素的指针,即1行0元素地址2016a[1][0],*(a[1]),*(*(a+1))1行0元素值9a[1]+1,*(a+1)+1,&a[1][1]1行1列地址2020a[1][1],*(*(a+1)+1),*(a[1]+1)1行1列11

这里就表格第三行进一步阐述指针的加减运算实际值是怎么操作: 由于a本身是指向一维数组(一行)的指针,此时a+1即+(4*4)=16.而在*(a+1)之后,指针转入指向列的指针,此时+1即是+4(一个整数分配4个字节)因此可以看到a=2000,而*(a+1)+1=2020. 在多维数组指针里面最重要的就是如何表示地址,如何表示元素的值,另外重要的就是明白对指针的运算时如何对实际值增加的.知道这三点, 指针的用法就都是相通的了,其他的操作和基础指针是相同的,在这里就不赘述了.多尝试,熟能生巧.

总结 上面没有提到但第一章有强调: 单目操作符(*, ++, --),遵循从右向左优先结合规律.*和[]等效!!!获取地址的表示方法——指针本身(数组名),&元素.获取元素值的表示方法.指针的运算不是简单的数学加减,要考虑到当前情况下指针的类型通过指针引用字符串的方法——传入指针而不是地址.


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3