A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 桑托尔 中级黑马   /  2014-4-24 10:09  /  1238 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 桑托尔 于 2014-4-25 08:18 编辑

由一道题引发的问题。
设有定义int a[]={1,3,5,7,9},*p=a;结果为7的表达式是()。
A) *(p+3)
B) *(p+4)
C) *p+3
D) *p+4

为什么有的时候指向数组中某个元素 ,是用"+"来完成的,有的时候用[ ]。这个不理解
还有就是加号的话,有什么使用的注意和细节,望诸位哥哥姐姐指教!
{:3_64:}{:3_64:}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

正序浏览
1、[]里面不能写变量,只能写常量,或者写宏,宏是在编译0和1之前运行的,牵扯的跟这个关系不大,目前一般[]里不写值的灵活性更大。
2、int *p = a;  这里是把a的地址赋值给了p,a是数组名,可以省略&
3、*(p+3) :这里p是存储的a的地址,也就是a[0]这个位置,p+3 就是在p的基础上往右移三位,加上括号就是优先计算括号里的,再把这个地址对应的值取出来就是7这个位置的,不加括号就先把这个地址对应的值取出来再加上数字三,就是地址位置 也是a[0]这个位置为1+3=4
#include <stdio.h>

int main()
{
    int a[]={1,3,5,7,9},*p=a;
   
    printf("%d\n", *(p+3));  //先计算括号里的算出来的地址再取值
    printf("%d\n", *p+3);//先取值后计算
   
   
    return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
数组名就是数组的地址,也是数组首元素的地址。

数组的访问方式:
int ages[5];
int *p;
p = &ages[0].//等价于 p = ages;
1>        数组名[下标]   如:ages[i]
2>        数组指针[下标] 如:p[i]
3>        指针运算       如:*(p+i)


指针+1并不是指针存储的地址值+1,具体加多少取决于指针的类型。如
int *p         p+1表示p的地址值加4
char *p        p+1表示p的地址值加1
double *p      p+1表示p的地址值加8

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
设有定义int a[]={1,3,5,7,9},*p=a;结果为7的表达式是(A)。
A) *(p+3)
B) *(p+4)
C) *p+3
D) *p+4
"+"会改变,p的值,[ ]的意思是不改变P的值来提取数组元素。

有点类似与。
+:
int a=0;
a=a+3
printf("%d",a);
a的值变了

[]
int a=0;
printf("%d",(a+3));
a的值没变

但输出都一样
回复 使用道具 举报
用[]其实是直接访问数组中的元素,比如a[0]相当于数组第一个数的变量名,a[0]其实是一个整体,而用+其实是用的地址也就是指针,比如这道题中*(p+1),地址p代表的是数组开始的地址,(p+1)代表把p往后移动一个int的地址,指向了a[1],然后*符号是取地址指向的值。总的来说地址指向更通用,因为是直接操作地址,而[]是针对数组的

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马