看着谭浩强的书,我郁闷了

int v(int *a,int n)
{int *p;
a=p+n;}
注:main{int a[10],x;省略赋值了,省略剩下的 x=v(a,10);}
a=p+n合法吗?指针=指针+数字,指针不是地址吗?怎么能和数据相加?
回复列表(15|隐藏机器人聊天)
  • @Ta / 2012-03-29 / /
    沙发
  • @Ta / 2012-03-29 / /
    指针是内存地址,本质就是一个数字,它表示从0x00起内存的位置。
    所以,如果a=0x00,p=a+5,那p就是0x05,表示内存的第5字节。
    这是很方便的。
  • @Ta / 2012-03-29 / /
    比如
    char *a="abcdefg";
    我要显示第三个字以后的内容,就是defg
    char *b=a+3;
    printf("%s",b);
    很方便吧
  • @Ta / 2012-03-29 / /
    想看指针到底指向内存的哪里,可以这样:
    char *a="abcd";
    char *b=a+3;
    printf("a=%d\nb=%d\n",(int)a,(int)b);
    也许,你得到的结果会令你惊讶的。如果你发现b<a,不要惊讶,因为大部分电脑都是倒着存储和读写数据的,在内存中,实际上是"dcba"
  • @Ta / 2012-03-29 / /
    指针不是数据,它只是数据的地址,它告诉了我们数据的类型和位置。
    所以,指针+n得到一个指向当前数据之后的第n个数据,指针-n相反。
    对于不同类型的指针,加减实际偏移的字节数是不同的。比如
    int a[2];
    int *b;
    b=&a[0]+1;
    此时,*b和a[1]是等效的。而&a[0]+1实际上把a[0]的地址加了4字节,这是一个int的长度。
  • @Ta / 2012-03-29 / /
    嗯,指针和整形数相加还是指针,指针与指针相减就成整形数了。
  • @Ta / 2012-03-29 / /
    老虎是集大成者,说的好广、好深,我们上学期学的C。指针加整数n,表示指向后移n位。比如题中数组a,假设这样定义:
    a[10]={1,2,3,4,5,6,7,8,9,0};
    int *p1=a,*p2;
    int num;
    p2=p1 4;//则此时,指针p2指向a[4]
     printf("%d",*p2);//则输出结果为: 4
    num=p2-p1;
     printf("%d",num);//此时输出为:4
  • @Ta / 2012-03-29 / /
    呃,代码第六行 p2=p1 4;,加号打成空格了,应该是: p2=p1+4;
  • @Ta / 2012-03-29 / /
    啊啊啊啊啊啊,又写错了,
     printf("%d",*p2);//则输出结果为: 4
    输出结果应该是:5。
  • @Ta / 2012-03-29 / /
    由7楼也可以推出5楼的结论。因为int是4字节的(我不知道VC++是不是,它可能是2字节,但手机的int都是4字节),那么
    (int)p2 - (int)p1
    的结果应该是16
    如果int是2字节,结果就是8
  • @Ta / 2012-03-29 / /
    谢谢老虎,说的真不错……
  • @Ta / 2012-03-29 / /
    我看的是清华大学的!
  • @Ta / 2012-03-29 / /
    5楼的结论还有这样一个推论:
    void *a,*b;
    a=malloc(100);
    b=a+10086;
    此时b==a
    如果指针是void型的,无论加减多少都不会变。
    我在MPC上证实了这一点。
  • @Ta / 2012-03-29 / /
    指针可以和数字相加的。。。
  • @Ta / 2012-03-29 / /
    C语言!哈哈
添加新回复
回复需要登录