6.指针与数组

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值