首页 > C/C++ > 数组、指针和地址运算:一个经典的小问题

数组、指针和地址运算:一个经典的小问题

2012年3月18日 发表评论 阅读评论
文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   转载请注明,谢谢合作。

---

在《The C Programming Language》中提到,数组、指针和地址的算术运算是C语言的一大优点,使用指针运算不仅能使得代码简洁精炼,更能编写高效率的程序,但是灵活运用却不是那么容易的事情,在使用过程中可能会遇到很多小问题,本节罗列一个比较经典的小例子。

代码见下:

#include<stdio.h>

void test(char *arg[]);

void main()
{
	char *arg[] =
	{
		"find",
		"-x",
		"-n"
	};
  //printf("%c\n",(*++arg)[0]); // --1
	test(arg);
	printf("%c\n",*++arg[0]); // --2
}

void test(char *arg[])// --3
{
	printf("%c\n",(*++arg)[0]);
}

对于上述代码分析如下:

/* 1 非法,因为arg是数组名,即数组地址,数组地址是固定的,不能进行加减 */

/* 2 [] 优先级大于 ++ 和 *; arg[0]是第一个字符串的地址,即find的首字符地址 */

/* 3 对于1的操作是非法的,为什么3中的操作就是合法的?很经典的问题

原因:数组在作为参数传递时,数组地址会转为指针类型(并且是指针的值传递,数值引用),即,incomplete type 转为了pointer type,所以3中的局部变量形参arg已转为char**arg故可以进行指针加减运算 */

/* 4 这里涉及到 arg[0]的++ 和 arg 的++, 指针的加减运算是以所指对象为单位的(理解这点很重要)

arg[0]是字符指针,所对应的对象是字符,故++后移动一个字符长度

arg是字符串指针,即指针的指针,对应的对象是字符串,所以++后移动一个字符串对象长度,指向下一个对象 */

/* 5 输出结果:‘-’  ‘i’  */

(全文完)