指针赋值 int a[5]={.... ...}, a 、&a[0]、 &a三者之间的区别 浅析 C/C++求职面试必备考点(五)
2012-08-12 22:50
495 查看
首先,来看代码:
首先程序声明了字符数组a,并且初始化,这个记得是默认后面加'\0'的。然后声明了字符指针,指向数组a的首地址,也是a[0]的地址,这里
注意这里的
也就是说我们仅仅是通过*(p+4),来查看里面的内容,但并没有改变p的指向。p仍然指的是首地址,所以打印出的字符串也是从首字符开始的。
如果我们再代码中,加上这两句:
printf("%c\n", *p++);
printf("%s\n", p);
第一句执行结果是打印首字符‘B’,然后p往后移一位。所以下面一句打印字符串,直接从第二个字符开始的,结果是ruceLee。
总结:(*p+4)这种方式并未改变指针p的指向。只有p++、p--或者p+=4类似这种方式,才改变指针p的指向!
下面再来看一个例子:
1,
2,int *p = a; 和 int *q = (int *)a,这两句话效果是一样的,在这里加不加前面的强制转换都一样。
再看这个迷惑性强的例子:
1,注意上面我们说那么(int *)可有可无,但是当加了&后,在int *m = (int *)&a[0]这里,如果不加强制转换会报警,因为这里取了地址,最好强制转换一下!
2,(int*)(&a[0]) 和(int *)(&a),从打印m和p的值来看,貌似这两种操作是没有区别的,但其实并非如此!&a[0] = a,都是代表数组a的首地址,也就是a[0]的地址。但&a是整个对象,也就是a这个数组整体的首地址。紧跟其后的指针q的申明,&a + 1究竟是谁的地址呢?
我们要切记,对指针进行加1操作,得到是下一个元素的地址,而不是原有地址的数值直接加1,这点大家肯定都知道。假设类型为x,则加1后,指针向后移动sizeof(x),移动是以sizeof(x)为单位的!
我怎么越说越不明白了,其实就是a和&a[0]以及&a,三者的区别!
前两个是等价的。&a上面也说过了,把a看成一个整体,所以&a + 1是a下一个对象的地址,即&a + 1,以相对a或者&a[0]来说,移动了sizeof(a) = 5*4 = 20个字节,即这里指针q指向a[5]!所以*(q - 1)的值是5,也就是a[4] 的值。 为了对照区别,最后我取了(&a[0] +
1)来做对照,w在申明时指向a【1】,*(q-1)的值是1,也就是a[0]的值。
3,int *n = a 等价于 int *n = (int *)&a[0] ,从指向上来看也等价于 int *n = (int *)&a;
但 当有指针加减操作时,两者的结果绝不相同![b][u]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![/u][/b]
如:int *n = (int *)(&a[0] + 1)绝不等于 int *n = (int *)(&a + 1)。
#include <stdio.h> void main() { char a[] = "BruceLee!"; char *p = a; printf("%c\n", *(p+4)); printf("%c\n", p[4]); printf("%s\n", p); printf("%c\n", a[4]); printf("%c\n", *(a+4)); printf("%s\n", a); }
首先程序声明了字符数组a,并且初始化,这个记得是默认后面加'\0'的。然后声明了字符指针,指向数组a的首地址,也是a[0]的地址,这里
char *p = a; 等价于char *p = &a[0]。*(p+4) = p[4] = a[4] = *(a+4),这是最终的结果。这里需要注意的是,字符指针p和数组的名字a每个都有两种引用方法,一种是数组的引用方法如a[4],一种是*(a+4),指针的方法。
注意这里的
printf("%s\n", p);打印的内容仍然是[code]BruceLee!
也就是说我们仅仅是通过*(p+4),来查看里面的内容,但并没有改变p的指向。p仍然指的是首地址,所以打印出的字符串也是从首字符开始的。
如果我们再代码中,加上这两句:
printf("%c\n", *p++);
printf("%s\n", p);
第一句执行结果是打印首字符‘B’,然后p往后移一位。所以下面一句打印字符串,直接从第二个字符开始的,结果是ruceLee。
总结:(*p+4)这种方式并未改变指针p的指向。只有p++、p--或者p+=4类似这种方式,才改变指针p的指向!
下面再来看一个例子:
#include <stdio.h> void main() { int a[5] = {1, 2 ,3 , 4, 5}; int *p = a; printf("%d\n", a[0]); printf("%d\n", *p); printf("%d\n", p); int *q = (int *)a; printf("%d\n", q[0]); }需要说的有两点:
1,
printf("%d\n", p);这句话是不能正常执行的,打印出来和数组a毫无相关的数字。不要期望像printf(“%s”, p)p为首地址。这种方式企图打印整个数组a的内容!
2,int *p = a; 和 int *q = (int *)a,这两句话效果是一样的,在这里加不加前面的强制转换都一样。
再看这个迷惑性强的例子:
#include <stdio.h> void main() { int a[5] = {1, 2 ,3 , 4, 5}; int *m = (int *)&a[0]; printf("%d\n", *(m + 1)); int *p = (int *)&a; printf("%d\n", *(p + 1)); int *q = (int *)(&a + 1); printf("%d\n", *(q-1)); int *w = (int *)(&a[0] + 1); printf("%d\n", *(w-1)); }有三个要点:
1,注意上面我们说那么(int *)可有可无,但是当加了&后,在int *m = (int *)&a[0]这里,如果不加强制转换会报警,因为这里取了地址,最好强制转换一下!
2,(int*)(&a[0]) 和(int *)(&a),从打印m和p的值来看,貌似这两种操作是没有区别的,但其实并非如此!&a[0] = a,都是代表数组a的首地址,也就是a[0]的地址。但&a是整个对象,也就是a这个数组整体的首地址。紧跟其后的指针q的申明,&a + 1究竟是谁的地址呢?
我们要切记,对指针进行加1操作,得到是下一个元素的地址,而不是原有地址的数值直接加1,这点大家肯定都知道。假设类型为x,则加1后,指针向后移动sizeof(x),移动是以sizeof(x)为单位的!
我怎么越说越不明白了,其实就是a和&a[0]以及&a,三者的区别!
前两个是等价的。&a上面也说过了,把a看成一个整体,所以&a + 1是a下一个对象的地址,即&a + 1,以相对a或者&a[0]来说,移动了sizeof(a) = 5*4 = 20个字节,即这里指针q指向a[5]!所以*(q - 1)的值是5,也就是a[4] 的值。 为了对照区别,最后我取了(&a[0] +
1)来做对照,w在申明时指向a【1】,*(q-1)的值是1,也就是a[0]的值。
3,int *n = a 等价于 int *n = (int *)&a[0] ,从指向上来看也等价于 int *n = (int *)&a;
但 当有指针加减操作时,两者的结果绝不相同![b][u]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![/u][/b]
如:int *n = (int *)(&a[0] + 1)绝不等于 int *n = (int *)(&a + 1)。
相关文章推荐
- 指针赋值 int a[5]={.... ...}, a 、&a[0]、 &a三者之间的区别 浅析 C/C++求职面试必备考点(五) .
- C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数一览无遗! C/C++求职面试必备考点(四)
- C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)
- C/C++ 引用,赋值,指针之间的区别
- C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数一览无遗! C/C++求职面试必备考点(四)
- 字符串拼接函数strcat的实现 while(*p++ !='\0')跳出后,p究竟指向哪? C/C++求职面试必备考点(三)
- C++中指针*和引用&的区别
- More Effective C++----(1)指针与引用的区别 & (2)尽量使用C++风格的类型转换 & (3)不要对数组使用多态
- 【面试常见问题】【C++】指针和引用的区别,有哪些不同点,细细道2
- C++的引用和指针的区别(&和*)
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- [C++]给指针赋值和通过指针进行赋值的区别?
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
- [互联网面试笔试汇总C/C++-19] 指针和引用的区别
- 浅析C++中的初始化列表(区别赋值和初始化)
- 【面试常见问题】【C++】指针和引用的区别,有哪些不同点,细细道1
- iOS  日记2 --字符串赋值给指针与数组的区别
- C++指针之间的赋值与转换规则总结
- C++指针之间的赋值与转换规则总结
- C++ 字符类型总结&CString ,BSTR ,LPCTSTR之间关系和区别