学过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