C语言指针和数组

指针和数组

基本知识

数组名代表数组的首地址(两种特殊情况除外,一种是&arr,另一种是sizeof(数组名))(表示整个数组的大小)

sizeof(数组名)和sizeof(指针变量名)二者不可互换

a[i]实际上和*(a+i)访问的是同一个元素

指针的算术运算

p+j等价于&a[j],换一种方式访问数组元素

指针相减得到距离

//定义忽略
p=&a[i];
q=&a[j];
p-q=i-j;

指针与一维数组的关系

*(p+1)等价于a[i](首地址加偏移量)

不同点在于,p是指针变量,而a是指针常量

p++不是加1字节,取决于p的基类型

(*p)++和++(*p)

都是不可以连续访问的

输入

p++

输出

*p++

传递给函数的时候传递数组名或者指针

注:p+1实现不了连续访问的效果

指针与二维数组的关系

对于一个二维数组

a[i][j]
*(a+i)相当于a[i]
所以*(*(a+i)+j)就相当于a[i][j]

行指针

int (*p)[3];
p=a;
p+i就指向a[i]
*(p+i)+j就指向a[i][j]
取元素解引用

列指针(将p看成一维数组)

int *p;
p=a[0];//这一步相当于把a[0]看成一个整体
如果是int* p[3]那么表示存放指针的指针数组
(p+i*n+j);
或者p[i*n+j]

二维数组作函数参数

第二维不可省略

行列指针作函数参数

行指针

input(a,3,4)
void input(int (*p)[N],int m,int n);

列指针

input(*a,3,4)
voidinput(int *p,int m,int n);

字符数组和字符指针

数组名是常量,它的值不可以被修改,但是数组的内容是可以被修改的。

字符指针是一个变量,它的值可以被修改,但是由于其指向的是常量空间中的字符串,(如果指向字符数组就可以修改了)所以它所指向的空间中的内容是不能被修改的,这就是字符指针和字符数组的不同之处

对于字符指针解引用可以

指针数组和数组指针

指针数组

本质是数组,作用是存放指针;

int* arr[3]={&a,&b,&c};(这就是一个整型指针数组)

取元素的时候*(arr[i]);

数组指针

数组指针第一种指针,它表示指向数组元素首地址的一个指针

char (*pa)[4];

它和普通的指向数组首地址的指针的区别在于,对它进行加减操作移动的单位是一个数组,而普通的指向数组首地址的指针移动的单位是一个数组元素

指针数组和数组指针的根本区别就是运算符的优先级问题

posted @   诩en  阅读(143)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示