C语言 指针和数组

学过C的基本都了解指针和数组的用法,他们的区别在哪里呢

其实,指针也就是一串无符号整数,代表每一个地址线,因此我们可以来回赋值,通过地址找到数据,栈区是编译器控制,堆区我们可以手动拿到
尤其是学过汇编语言的,更明显的操作地址就是我们需要手动记住地址,没有编译器为我们管理,在C语言里面我们也可以用指针把需要的地址取出来,然后用 不同的处理方式进行处理:比如(long long*),(long *) 这是不一样的 如果在堆区 可以把 ** 理解为我们先开了一个数组指针数组 ,再把其中的指针填充为每一个一维数组, 而在栈区可以直接定义long long pp[][] 或者 说白了还是栈区为我们做了一层管理 只要我们申请了pp[][] 它就已经做好一维数组和数组指针的管理(PS:数组指针和longlong指针不一样,指针+1 对应的是+sizeof(元素)),栈区的元素如果是数组的话,会一次加好多,和longlong 的效果还是不一样的
如果更直观的管理数组我们还可以拿到数组的首地址(栈区开空间),二维数组是连续的,我们就可以手动的去通过首地址来操作整个二维数组

以下是代码简单测试


void or(int num,int p,...){
    printf("%p %p \n????",&num,&p);
    printf("%X======\n",*((&num)));
    printf("%X======\n",*((&num)-1));
    char* temp = (char*)(&num);
    //    temp+=4;
    temp -= 1;
    printf("%c\n",*temp);
    printf("%c\n",*(temp-1));
    printf("%c\n",*(temp-2));
    printf("%c\n",*(temp-3));
}


/*
 * linux C的栈区 在我这个遍历器里面是由低到高的
 * 而大部分人的编译器是由高到低的
 * 在上边的不定参数测试中,只有向低地址寻址才能找到入栈的函数参数
 *
 * main函数里面解释了数组和指针以及数组指针的区别
 *
 * 数组可以直接+1  数组是连续 空间  但是数组指针实际上不可以 +1   这样会直接在二维数组中 出现错误 指向下一个一维数组
 *
 * 由于我是64位编译器  注意地址是64位  (本程序没有体现)
 *
 * */
int main(){
    long long int ar[10];

    long  long int *pp[10];
    pp[0] = ar;
    printf("%p %p === \n",&pp,&pp[0]);
    for(long long int i=0;i<10;i++){
        //            pp[0][i] = 666;
        ((long long int*)*pp)[i] = 666;
    }
    *(((long long *)(*(pp+1)))+5) = 1433223;
    for(int i=0;i<10;i++){
        printf("%lld\n",ar[i]);
    }
    //    or(args,0x32323232);

    return 0;
    //    unsigned int lang = 50000000;
    //    unsigned long long *a = randUnsignedLong(lang);
    //    for(int ii=0;ii<lang;ii++){
    //        ArrayList array = ArrayList_New();
    //        if(array == NULL){
    //            return 0;
    //        }
    //        ArrayList_Destroy(array);
    //    }
    //    free(a);
}

0x7fff74fe14e0 0x7fff74fe14e0 ===
666
666
666
666
666
1433223
666
666
666
666

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值