6. 指针与数组
数组名变量,它们有各自的内存空间,指针可以指向相同的常量区域
数组的引用被转化为指针加偏移量的引用
编译器为了简化对数组的支持,实际上是利用指针实现了对数组的支持。具体来说,就是将表达式中的数组元素引用转化为指针加偏移量的引用。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
数组:数组是一个连续占有一段内存单元的变量集合。
数组只能在定义时初始化,数组元素值可以随时改变。
数组下标从0开始,注意数组越界的问题
int a[5]; a[5]={0,1,2,3,4}; 错误 a[5] = 5; 错误
int a[5]={1,2,3,4,5};正确 int *p = a;
区别:
1. 指针是一个单独变量,只是指向了其他变量的地址(相当于汇编中的间接寻址,与地址寄存器类似);
数组是一串元素序列并且真实的存储元素内容,它的数组名相当一个指针,代表数组的首地址。
值: p[i] = a[i] = *(p+i) = *(a+i);
地址: &a[i] = & p[i] = a+i = p+i ;
2. sizeof计算结果不同
sizeof(数组名) = 数组元素*sizeof(数组类型);
sizeof(指针) = 指针字节大小;
3. 拷贝方式不同,指针赋值,数组内存拷贝
字符串与字符数组
char *ptr = “hello world!”; strlen遇到’/0’停止; strlen(ptr) = 12. sizeof(ptr) = 4; 32位
字符串常量存储于静态已初始化数据区,指针ptr指向静态数据区内这个字符串的内存。
char ptr[] = “hello world”; sizeof(ptr) = 13; 要加上\0的长度 strlen(ptr) = 12.
字符串数组,每个数组元素存贮一个字符,数组存储于栈区。
指针数组与数组指针
指针数组
指针数组可以说成是“指针的数组”,数组的所有元素都是指针类型。
int *p[4];[ ]优先级高于* ,每个数组元素都是一个指向整形变量的指针。
数组指针
数组指针可以说成是”数组的指针”,这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。
int (*p)[4];()和[ ] 优先级一样,从左至右运算。一个指向含有4个整形变量数组的指针
使用
指针数组对应着二级指针,常用于主函数传参或者是子函数传参
void fun(char **p){ } char** p ==char* p[ ]; 二级指针 char* p == char p[ ]; 指针
数组指针既然是一个指针,那么就是用来接收地址,在传参时就接收数组的地址,所以数组指针对应的是二维数组。
void fun(int (*P)[4]);//子函数中的形参,指针数组
a[3][4] = {0};//主函数中定义的二维数组
fun(a);//主函数调用子函数的实参,是二维数组的首元素首地址
更多使用参考博客: https://blog.csdn.net/kulala082/article/details/53407712