您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-03 09:40 274 查看
      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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: