通过指针引用数组元素(3/3) 3)指向数组的指针变量也可以带下标,如p与 (P+)等价。 根据以上叙述,引用一个数组元素,可以用: (a下标法,如a形式 b)指针法,如*(a+)或口p+)。其中a是数组名, p是指向数组的指针变量,其初值p=a。 例10.5输出数组中的全部元素 程序代码见10-5
通过指针引用数组元素(3/3) 3)指向数组的指针变量也可以带下标,如p[i]与 (p+i)等价。 根据以上叙述,引用一个数组元素,可以用: (a) 下标法,如a[i]形式; (b) 指针法,如*(a+i) (p+i)。其中a是数组名, p是指向数组的指针变量,其初值p=a。 例10.5 输出数组中的全部元素 程序代码见10-5
使用指针变量指向数组元素的需注意的地方 1)指针变量可以实现使本身的值改变。但数组名不能 实现使本身的值改变。 例如,上述第(3)种方法是用指针变量p来指向元素,用 p++使p的值不断改变,这是合法的。如果不用p而使a变 化(例如,用a++)行不行呢?假如将上述(3程序的最后 两行改为 for(p=a;a<p+10);a++) printf("od",*a); 是不行的。因为a是数组名,它是数组首地址,它的值 在程序运行期间是固定不变的,是常量
使用指针变量指向数组元素的需注意的地方 1)指针变量可以实现使本身的值改变。但数组名不能 实现使本身的值改变。 例如,上述第(3)种方法是用指针变量p来指向元素,用 p++使p的值不断改变,这是合法的。如果不用p而使a变 化(例如,用a++)行不行呢?假如将上述(3)程序的最后 两行改为 for(p=a;a<(p+10);a++) { printf("%d", *a); } 是不行的。因为a是数组名,它是数组首地址,它的值 在程序运行期间是固定不变的,是常量
使用指针变量指向数组元素的需注意的地方 2)要注意指针变量的当前值。 看看下面的程序有什么错误: void fun() int p,i,a[10]; p=a; for(i=0;i<10;i++) scanf("%d“,p++)月 } printf("\n"); for(i=0;i<10;i计+,p++) printf(("od“,p); }
使用指针变量指向数组元素的需注意的地方 2)要注意指针变量的当前值。 看看下面的程序有什么错误: void fun() { int p, i, a[10]; p=a; for(i=0; i<10; i++) { scanf("%d“, p++); } printf("\n"); for(i=0; i<10; i++, p++) { printf("%d“, p); } }
使用指针变量指向数组元素的需注意的地方 3)指针变量可以指向数组以后的内存单元。 例如:如果引用数组元素a[10,C编译程序并不 认为非法,系统把它按*a+10处理,即先找出 (a+10的值(是一个地址),然后找出它指向的单元 的内容。这样做虽然是合法的(在编译时不出错), 但应避免出现这样的情况,这会使程序得不到预 期的结果。这种错误比较隐蔽,初学者往往难以 发现。在使用指针变量指向数组元素时,应切实 保证指向数组中有效的元素
使用指针变量指向数组元素的需注意的地方 3)指针变量可以指向数组以后的内存单元。 例如:如果引用数组元素a[10],C编译程序并不 认为非法,系统把它按*(a+10)处理,即先找出 (a+10)的值(是一个地址),然后找出它指向的单元 的内容。这样做虽然是合法的(在编译时不出错), 但应避免出现这样的情况,这会使程序得不到预 期的结果。这种错误比较隐蔽,初学者往往难以 发现。在使用指针变量指向数组元素时,应切实 保证指向数组中有效的元素
使用指针变量指向数组元素的需注意的地方 4)注意指针变量的运算。如果先使p指向数组a(即p=a),则: ①p++(或p+=1),使p指向下一元素,即a[1]。若再执行*p,取出下一个元素a[] 值。 ②p士+,由于++和*同优先级,结合方向为自右而左,因此它等价于*®++)。 作用是先得到p指向的变量的值(即*p),然后再使p+1=>p。 ③*p++)与*(++p)作用不同。前者是先取p值,后使p加1。后者是先使p加1, 再取*p。 ④(pt+表示p所指向的元素值加1,即(a0++,,如果a0=3,则(a0)++的值 为4。注意:是元素值加1,而不是指针值加1。 ⑤如果p当前指向a数组中第个元素,则: *p-)相当于a],先对p进行“*”运算,再使p自减。 v*(什+p相当于a++,先使p自加,再作*运算。 *(-p)相当于a[-可,先使p自减,再作运算
使用指针变量指向数组元素的需注意的地方 4)注意指针变量的运算。如果先使p指向数组a(即p=a),则: ① p++(或p+=1),使p指向下一元素,即a[1]。若再执行*p,取出下一个元素a[1] 值。 ② *p++,由于++和*同优先级,结合方向为自右而左,因此它等价于*(p++)。 作用是先得到p指向的变量的值(即*p),然后再使p+1=>p。 ③ *(p++)与*(++p)作用不同。前者是先取*p值,后使p加1。后者是先使p加1, 再取*p。 ④ (*p)++表示p所指向的元素值加1,即(a[0])++,如果a[0]=3,则(a[0])++的值 为4。注意:是元素值加1,而不是指针值加1。 ⑤ 如果p当前指向a数组中第i个元素,则: ✓ *(p-)相当于a[i-],先对p进行“*”运算,再使p自减。 ✓ *(++p)相当于a[++i],先使p自加,再作*运算。 ✓ *(-p)相当于a[-i],先使p自减,再作*运算