15 int *ptr= (int *)(&a+1)跨了整个数组长度

本文详细解析了C语言中数组与指针的关系,通过具体示例解释了数组名、数组地址运算及指针操作的区别,并展示了如何正确使用指针进行数组元素的访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析以下程序,输出结果 2,5

#include<stdio.h>
int main() {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    return 0;
}

分析:

a 代表的是int * 每次步长为一个int;

&a 代表的是 int[]* 每次步长为所指向的数组的大小。(&a是数组指针,其类型是int(*)[5])

ptr 指向的是数组a最后一个元素的下一个元素

所以ptr-1指向的是数组a的最后一个元素

*(a+1)指向的是数组a的第二个元素,等价于a[1]。

 

补充:对数组名取地址,&a,得到的是整个数组的首地址,是与数组首元素的地址是相等的,但是意义不同。

所以(a+1)是将地址值加4(一个int占4个字节大小),而&a+1是将地址值加20(数组大小为4字节*5个int类型的数字)。

 

注意:int *p=(int *)&a+1; 与 int *ptr=(int *)(&a+1);是不同的。

#include<stdio.h>
int main() {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    int *p=(int *)&a+1;
    printf("\n%d",*p);
    return 0;
}

 

转载于:https://www.cnblogs.com/dd2hm/p/7269360.html

3.二级指针 一级指针存放普通变量的地址 二级指针存放一级指针的地址 格式: 存储类型 数据类型 **指针变量名 int **p; int a=333; int *p=&amp;a; int **q=&amp;p; q = &amp;p *q = *&amp;p = p = &amp;a **q = *p = *&amp;a = a 取变量a的值: a *p **q 取变量a的地址: &amp;a p *q 取p的地址: &amp;p q 4.指针和数组 直接访问:通过数组名访问 间接访问:通过指针访问 直接访问: int a[5]={5,6,7,8,9}; 地址 元素 a &amp;a[0] 5 a[0] *a a+1 &amp;a[1] 6 a[1] *(a+1) a+2 &amp;a[2] 7 a[2] *(a+2) a+3 &amp;a[3] 8 a[3] *(a+3) a+4 &amp;a[4] 9 a[4] *(a+4) 间接访问: int a[5]={5,6,7,8,9}; int *p=a; 地址 元素 &amp;p[0] p 5 *p p[0] &amp;p[1] p+1 6 *(p+1) p[1] &amp;p[2] p+2 7 *(p+2) p[2] &amp;p[3] p+3 8 *(p+3) p[3] &amp;p[4] p+4 9 *(p+4) p[4] a和p一样吗: 不一样,a是地址常量,不能被修改,p可以 直接访问: 元素:*(a+i) a[i] 地址:a+i &amp;a[i] 间接访问: 元素:p[i] *(p+i) 地址:p+i &amp;p[i] 补充: char a[]="hello"; // 栈区开辟6字节存放"hello" char *p="world"; //栈区开辟8字节存放 "world"所在常量区的首地址 指针和二维数组 直接访问: int a[2][3]={4,5,6,7,8,9}; 二维数组数组名是行地址,行地址>列地址 加*降级成了列地址 a : 首行地址 a+1: 第二行首地址 *a: 第一行第一列 *a+1: 第一行第二列 地址 元素 *a a a[0] &amp;a[0][0] 4 a[0][0] *a[0] **a *a+1 a[0]+1 &amp;a[0][1] 5 a[0][1] *(a[0]+1) *(*a+1) *a+2 a[0]+2 &amp;a[0][2] 6 a[0][2] *(a[0]+2) *(*a+2) *(a+1) a+1 a[1] &amp;a[1][0] 7 a[1][0] *a[1] **(a+1) *(a+1)+1 a[1]+1 &amp;a[1][1] 8 a[1][1] *(a[1]+1) *(*(a+1)+1) *(a+1)+2 a[1]+2 &amp;a[1][2] 9 a[1][2] *(a[1]+2) *(*(a+1)+2) 间接访问: int a[2][3]={4,5,6,7,8,9}; int *p=a; 直接访问: 元素:a[i][j] *(a[i]+j) *(*(a+i)+j) 地址:*(a+i)+j a[i]+j &amp;a[i][j] 用Markdown形式写一篇笔记
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值