C语言指针回顾(三) 指针的运算
2017-08-03 09:40
274 查看
1、指针的算数运算
在牛客网上看到了这样的程序,如下:
为什么呢?int * p = (int *) ch; 这种强制类型转换并不会改变 ch 是char * 类型。 p++ 就是在首地址 ch 的基础上加上 sizeof (int),也就是4个字节,一个 char 型为1个字节,所以,将 ch 往后移动4个字节,也就是 e ,对应的值为 101。
下面讨论(*p)++,*p++ ,*(p++)。看下面程序:
再看下面这个:
再看一段程序,区分 *p++ 和 *(p++)。
再看下面一段程序;
IEEE标准中,一个char就是一个字节(byte),一个指针(或者说是一个int)就是4个字节(bytes),这是统一标准。
接下来说说指针,指针存放地址,一般PC上使用的本机编译程序是32位的,对内存和虚拟内存编制地址空间时候,每个地址用32位(也就是4个字节)的整数表示。另外,如果你不明白为什么char*,long*,double*,......,int*都是指针类型,即大小都是4 bytes。
在牛客网上看到了这样的程序,如下:
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语言及程序设计》实践项目——指针及其运算
- 黑马程序员-------C语言回顾-字符串指针
- C语言学习篇-9指针运算、指针与数组
- C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态
- C语言----指针算术运算
- c语言二维数组的下标运算与指针偏移
- C语言及程序设计提高例程-23 指针的运算
- C语言:断言,指针的算数运算
- NDK开发系列之第三课C语言的指针运算
- 12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!
- C语言及程序设计初步例程-14 指针及其运算
- c语言指针初探 一指针运算与多级指针
- C语言——指针的运算
- 基础之路02,C语言中的指针之间的算术运算
- C语言中指针和自增运算符结合时的运算顺序问题
- C语言:指针的运算
- [C语言] 指针的算术运算
- 【C语言】指针算术运算
- c语言基础回顾-指针2
- C语言void指针的运算操作[小知识]