鱼C论坛

 找回密码
 立即注册
查看: 1390|回复: 4

[已解决]求助一个行指针的问题

[复制链接]
发表于 2021-3-12 11:47:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int a[3][4];//三行四列,每行有4个元素
int (*p)[4]; //定义一个行指针
p = a;代表p指向数组a的第0行//若a+1,表示下一行
a,*a的区别

代码如上
书上没看懂
a,*a的区别 这个有啥区别,怎么分辨呢
最佳答案
2021-3-12 12:14:42
本帖最后由 jackz007 于 2021-3-12 12:18 编辑
#include <stdio.h>

int main(void)
{
        int a[3][4] = {{1 ,  2  ,  3  , 4} ,
                       {5 ,  6  ,  7  , 8} ,
                       {9 , 10  , 11 , 12}} ;
        printf("a = %p , * a = %p , ** a = %p\n" , a , * a , ** a)                         ;
        printf("a + 1 = %p , * a + 1 = %p , ** a + 1 = %p\n" , a + 1 , * a + 1 , ** a + 1) ;
}
        运行实况
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
a = 0028FE90 , * a = 0028FE90 , ** a = 00000001
a + 1 = 0028FEA0 , * a + 1 = 0028FE94 , ** a + 1 = 00000002

D:\0002.Exercise\C>
       从代码运行结果可以看出:
       a 的内存地址是 0x0028FE90,a 和 * a 指向的都是 a 的首地址,但是,含义有所不同,a 是整个数组的首地址,* a 是第一行数据的起始地址,二者只是恰好相同, ** a 是数组的第一个元素 1;
       a + 1 的内存地址是 0x0028FEA0,比 0x0028FE90 前进了 16 个字节,正好是 4 个 int 的存储空间,就是说,a + 1 指向下一行数据的起始地址;
       * a + 1 的内存地址是 0x0028FE94,比 0x0028FE90 前进了 4 个字节,正好是 1 个 int 的存储空间,就是说,* a + 1 指向本行数据下一个元素的起始地址;
       ** a + 1 的值是 2,也就是 a[0][0] + 1 的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-12 12:14:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-3-12 12:18 编辑
#include <stdio.h>

int main(void)
{
        int a[3][4] = {{1 ,  2  ,  3  , 4} ,
                       {5 ,  6  ,  7  , 8} ,
                       {9 , 10  , 11 , 12}} ;
        printf("a = %p , * a = %p , ** a = %p\n" , a , * a , ** a)                         ;
        printf("a + 1 = %p , * a + 1 = %p , ** a + 1 = %p\n" , a + 1 , * a + 1 , ** a + 1) ;
}
        运行实况
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
a = 0028FE90 , * a = 0028FE90 , ** a = 00000001
a + 1 = 0028FEA0 , * a + 1 = 0028FE94 , ** a + 1 = 00000002

D:\0002.Exercise\C>
       从代码运行结果可以看出:
       a 的内存地址是 0x0028FE90,a 和 * a 指向的都是 a 的首地址,但是,含义有所不同,a 是整个数组的首地址,* a 是第一行数据的起始地址,二者只是恰好相同, ** a 是数组的第一个元素 1;
       a + 1 的内存地址是 0x0028FEA0,比 0x0028FE90 前进了 16 个字节,正好是 4 个 int 的存储空间,就是说,a + 1 指向下一行数据的起始地址;
       * a + 1 的内存地址是 0x0028FE94,比 0x0028FE90 前进了 4 个字节,正好是 1 个 int 的存储空间,就是说,* a + 1 指向本行数据下一个元素的起始地址;
       ** a + 1 的值是 2,也就是 a[0][0] + 1 的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-12 15:56:22 From FishC Mobile | 显示全部楼层
jackz007 发表于 2021-3-12 12:14
运行实况

       从代码运行结果可以看出:

谢谢老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-12 16:05:53 From FishC Mobile | 显示全部楼层
感觉有点奇怪,a本来是地址也是指针,之前的指针比如说指针p,然后变成*p这就代表指针的值。但是在行指针加上一个*还是指地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-12 19:43:21 From FishC Mobile | 显示全部楼层
a即是整个数组的首地址,又是第一行的地址吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 03:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表