指针与数组的关系和malloc动态分配空房间

思考1: 

    2个指针变量能否同时指向1个变量,要是这样做了,会有什么不好的后果?

若指针类型不一致,很可能导致修改过程中出现错误。尽量避免这种写法。

若类型一致暂时没找到毛病,但这肯定不是一个好习惯。避免这种写法。

思考2:

     const的指针与数组的关系,数组是可以看作const的指针,还是说数组就是const的指针?

附上代码:

#include<stdio.h>
void text(int array[], int *const p1, const int *p2);
int  main()
{
     int array[] = {1,2,3,4,5,6};
     int array1[] = {1,2,3,4,5,6};
     int array2[] = {1,2,3,4,5,6};
     int *const p1 = array1;
     const int *p2 = array2;
     text(array, p1, p2);
     return 0;
}
void text(int array[], int *const p1, const int *p2)
{
    printf("Opreation1:\n");
    printf("array[0] = %d\n", array[0]);
    printf("*p1 = %d\n*p2 = %d\n", *p1, *p2);
    
    array++, p2++;
    printf("Opreation2:\n");
    printf("array[0] = %d\n", array[0]);
    printf("p2 = %d\n", *p2);
    
    *array = *array + 1, *p1 = *p1 + 1;
    printf("Opreation3:\n");
    printf("array[0] = %d\n", array[0]);
    printf("p1 = %d\n", *p1);
}

这里通过一个自定义函数,可以对const的两种指针变量做的操作经过验证全部可以对数组变量做

即:数组变量可以实现自身地址改变的操作,也可以实现自身值的改变操作。

但对于const的两种指针变量,均不能单独实现这两种操作,

所以说数组就是const的指针,且功能更加强大。

数组还有一个很有意思的地方,可以试试:

 int a[] = {1,2,3,4,5,6,7};
    printf("a = %p\n", a);
    printf("&a = %p\n", &a);
    printf("a + 1 = %p\n", a + 1);
    printf("&a + 1 = %p\n", &a + 1);

一开始a和&a的值是相等的,但加了1之后就不等了。(差了28个字节)

即a是数组首元素的地址,&a是整个数组的地址。

a++的地址是数组第2个元素的地址,而&a++则是整个数组接下来的地址。

思考3:

    malloc动态分配空间比较有意思,附代码和运行结果如下:

代码:

    int *p =(int*) malloc (0);
    int *q =(int*) malloc (0);
    int *p1 = (int*) malloc (0);
    int *q1 = (int*) malloc (0);
    printf("p = %p\nq = %p\n",p, q);
    printf("p1 = %p\nq1 = %p\n", p1, q1);


    int *p2 =(int*) malloc (1);
    int *q2 =(int*) malloc (1);
    int *p3 = (int*) malloc (1);
    int *q3 = (int*) malloc (1);
    printf("p2 = %p\nq2 = %p\n", p2, q2);
    printf("p3 = %p\nq3 = %p\n", p3, q3);

运行结果:

p = 00000000001713E0
q = 0000000000171400
p1 = 0000000000171420
q1 = 0000000000171440


p2 = 0000000000179DC0
q2 = 0000000000179DE0
p3 = 0000000000179E00
q3 = 0000000000179E20
000000000062FDDC
000000000062FDD8

有趣的是,相邻的4次动态分配地址每次虽然不是相邻的,但很默契的差了32个字节。这其中有什么深明大义呢?动手查查。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值