关于指针, 为什么不能这么写?

deauxma 2015-12-07 04:17:29
malloc 获得一块连续的内存空间, 如果把值赋予一个连续移动的指针 , 如同得到一个数组, 对吗?

int *arr = (int*)malloc(5*sizeof(int));
*arr=0;
*(arr+1) = 1;
*(arr+2) = 2;
*(arr+3) = 3;
*(arr+4) = 4;

可是我把以上的赋值改为 for loop, arr++自增, 但储存的值不是连续的
for(int i=0; i<5; i++)
*(arr++)=i;

改为 *(arr+i)=i 就可以

arr++ 不就是 arr = arr +1 吗? 跟 (arr+i) 难道是不同的东西?
...全文
248 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-12-07
  • 打赏
  • 举报
回复
引用 14 楼 deauxma 的回复:
意思是说, *(arr+i)=i 没有移动指针,不过是赋值给指针之后的地址 *(arr++)=i 移动指针, 赋值给指针指着的地址?
是的,arr+i不对arr自身有任何改变,而arr++ 后arr的值会递增
deauxma 2015-12-07
  • 打赏
  • 举报
回复
意思是说, *(arr+i)=i 没有移动指针,不过是赋值给指针之后的地址 *(arr++)=i 移动指针, 赋值给指针指着的地址?
paschen 2015-12-07
  • 打赏
  • 举报
回复
引用 12 楼 deauxma 的回复:
[quote=引用 10 楼 seanking1987 的回复:]
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
嗯. 我看到
引用 10 楼 seanking1987 的回复:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
引用 10 楼 seanking1987 的回复:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
嗯. 我看到问题所在. 但还是没搞明白里头的逻辑 如果这么赋值 *(arr+i)=i , 那么输出的时候就用 arr[i] 反之, 如果换成 *(arr++)=i;, 那么输出就得改为 *(--arr) 哪位大大可以解释一下吗?[/quote] 如我前面回复所说,因为你用*(arr++)=i;赋值后,arr已经没有指向数组头部了,已经移动到后面了,楼主不会不知道++运算符的这个意思吧
deauxma 2015-12-07
  • 打赏
  • 举报
回复
引用 10 楼 seanking1987 的回复:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
嗯. 我看到
引用 10 楼 seanking1987 的回复:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
引用 10 楼 seanking1987 的回复:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
嗯. 我看到问题所在. 但还是没搞明白里头的逻辑 如果这么赋值 *(arr+i)=i , 那么输出的时候就用 arr[i] 反之, 如果换成 *(arr++)=i;, 那么输出就得改为 *(--arr) 哪位大大可以解释一下吗?
deauxma 2015-12-07
  • 打赏
  • 举报
回复
引用 9 楼 paschen 的回复:
[quote=引用 3 楼 deauxma 的回复:] [quote=引用 1 楼 Saleayas 的回复:] a++ 等同于 a = a + 1; 和 a + 1 不同的,有赋值的。
这我了解. 我不明白的是地址的值 例如说 地址 0x00332360 加 1 , 得到 0x00332361, 再加1 得到 0x00332362 以此类推 arr 储存地址的值, 自增1 后再赋予 arr,arr 的 地址值 不也会变为 0x00332361 吗? 是我哪里弄错了?[/quote] 看你指针的类型,如果是inr,+1地址移动的是4[/quote] 同意
seanking1987 2015-12-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int i=0;

        int *arr = (int*)malloc(5*sizeof(int));
        for(i=0;i<5;i++)
        {
                *(arr++)=i;
        }

        for(i=4;i>=0;i--)
        {
                printf("array[%d]:%d\n",i,*(--arr));
        }

        free(arr);
        return 0;
}
结果:
array[4]:4
array[3]:3
array[2]:2
array[1]:1
array[0]:0
paschen 2015-12-07
  • 打赏
  • 举报
回复
引用 3 楼 deauxma 的回复:
[quote=引用 1 楼 Saleayas 的回复:] a++ 等同于 a = a + 1; 和 a + 1 不同的,有赋值的。
这我了解. 我不明白的是地址的值 例如说 地址 0x00332360 加 1 , 得到 0x00332361, 再加1 得到 0x00332362 以此类推 arr 储存地址的值, 自增1 后再赋予 arr,arr 的 地址值 不也会变为 0x00332361 吗? 是我哪里弄错了?[/quote] 看你指针的类型,如果是inr,+1地址移动的是4
paschen 2015-12-07
  • 打赏
  • 举报
回复
*(arr++)=i; 也合法,但你之后要访问数组中的值或者要释放数组时要注意,arr已经不指向数组头部了
angel6709 2015-12-07
  • 打赏
  • 举报
回复
我也被你忽悠了
deauxma 2015-12-07
  • 打赏
  • 举报
回复
引用 4 楼 linzertling 的回复:
*(arr++)执行的时候把arr改变了,而*(arr+i)不改变arr的值,你的,明白?
原来如此!
fefe82 2015-12-07
  • 打赏
  • 举报
回复
引用 2 楼 angel6709 的回复:
*(arr++)是一个表达式,不是语句?
*(arr++) 是一个表达式 *(arr++); 是一个语句
deauxma 2015-12-07
  • 打赏
  • 举报
回复
引用 1 楼 Saleayas 的回复:
a++ 等同于 a = a + 1; 和 a + 1 不同的,有赋值的。
这我了解. 我不明白的是地址的值 例如说 地址 0x00332360 加 1 , 得到 0x00332361, 再加1 得到 0x00332362 以此类推 arr 储存地址的值, 自增1 后再赋予 arr,arr 的 地址值 不也会变为 0x00332361 吗? 是我哪里弄错了?
linzertling 2015-12-07
  • 打赏
  • 举报
回复
*(arr++)执行的时候把arr改变了,而*(arr+i)不改变arr的值,你的,明白?
angel6709 2015-12-07
  • 打赏
  • 举报
回复
*(arr++)是一个表达式,不是语句?
Saleayas 2015-12-07
  • 打赏
  • 举报
回复
a++ 等同于 a = a + 1; 和 a + 1 不同的,有赋值的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧