C语言指针回顾(三) 指针的运算

      1、指针的算数运算      

      在牛客网上看到了这样的程序,如下:

int main()
{
	char ch[10] = {'a','b','c','d','e'};
	int *p = (int *)ch;
	p++;
	cout << *p << endl;
}
      那么输出结果是什么?答案: 101

      为什么呢?int * p = (int *) ch; 这种强制类型转换并不会改变 ch 是char * 类型。 p++ 就是在首地址 ch 的基础上加上 sizeof (int),也就是4个字节,一个 char 型为1个字节,所以,将 ch 往后移动4个字节,也就是 e ,对应的值为 101。

      下面讨论(*p)++,*p++ ,*(p++)。看下面程序:

int main()
{
	int a[10] = {0,1,2,3,4,5,6,7,8,9};
	int *p = a;
	for (int i = 0; i < 10; i++)
	{
		(*p)++;
		p++;
	}
	for (int j = 0; j < 10; j++)
	{
		cout << a[j] << endl;
	}
}
输出结果为 1 2 3 4 5 6 7 8 9 10。(*p) ++表示向将p指向的值取出来,再+1。然后p++再往后移一位。所以最后结果是原来数组每个数字都加了1。

再看下面这个:

int main()
{
	int a[10] = {0,1,2,3,4,5,6,7,8,9};
	int *p = a;
	for (int i = 0; i < 10; i++)
	{
		*p++;
	//	p++;
		cout << *p << endl;
	}
}
输出结果是1 2 3 4 5 6 7 8 9 -858993460(很大的一个值,不用管它)。这里说明一点,如果单独一行,*p++和p++没任何区别。但是如果这样改:

int main()
{
	int a[10] = {0,1,2,3,4,5,6,7,8,9};
	int *p = a;
	for (int i = 0; i < 10; i++)
	{
		//*p++;
		cout << *p++ << endl;
	}
}
输出结果就是 0 1 2 3 4 5 6 7 8 9.这个时候,*p++和p++就有区别了。*p++表示先取值,然后再将地址 + 1。p ++仅仅表示将地址加1。

再看一段程序,区分 *p++ 和 *(p++)。
int main()
{
	int a[10] = {0,1,2,3,4,5,6,7,8,9};
	int *p = a;
	for (int i = 0; i < 10; i++)
	{
		//*p++;
		//cout << *p++ << endl;
		cout << *(p++) << endl;
	}
}
      输出结果仍然是0 1 2 3 4 5 6 7 8 9 。有人就问了,, *p++ 和 *(p++)是一样的吗?!对,没错,是一样的。 * 和 ++的优先级是一样的,++表示先取值,然后再加1,对于*(p++),虽然是由括号,但(p++)表示的内容是先取p,这个时候取出来的 p 就与 * 结合了,输出以后,再 p++。和不加括号的效果是一样的。
    再看下面一段程序;

int main()
{
	char ch[100] = "abcdefghijklmn";
	char *p = ch;
	char **pp = &p;
	p++;
	pp++;
	cout << *p << endl;
	//cout << **pp << endl; //输出错误
	//cout << sizeof(char) << endl;  //输出为 1
	//cout << sizeof(char *) << endl;   //输出为 4	
}
      说明一点,
      IEEE标准中,一个char就是一个字节(byte),一个指针(或者说是一个int)就是4个字节(bytes),这是统一标准。
接下来说说指针,指针存放地址,一般PC上使用的本机编译程序是32位的,对内存和虚拟内存编制地址空间时候,每个地址用32位(也就是4个字节)的整数表示。另外,如果你不明白为什么char*,long*,double*,......,int*都是指针类型,即大小都是4 bytes。

你可能感兴趣的:(C++基础与提高)