| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3209 人关注过本帖
标题:关于指针的一些疑惑
只看楼主 加入收藏
q386863114
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2019-7-19
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:11 
关于指针的一些疑惑
以前我以为指针里存放的就是地址,例如int * p = &a;(a是一个整形变量)。变量p中存放的就是a的地址,在输出的时候前面加上*号,就表示输出这个地址里的内容。但是在看到指向二维数组的指针的时候,我这个想法完全就错了,例如有个整形数组a[3][4],数组名a就是地址了,a+1表示第1行首元素的地址,但是输出时前加*的意义却不是输出这个地址中存放的元素,而是又输出了这个元素的地址,这点让我非常困惑,就是说a+1和*(a+1)表示的含义是完全相同的
搜索更多相关主题的帖子: 指针 地址 输出 表示 元素 
2019-08-29 20:27
c小白2333
Rank: 5Rank: 5
来 自:中国
等 级:贵宾
威 望:11
帖 子:121
专家分:367
注 册:2019-6-17
收藏
得分:4 
程序代码:
#include <stdio.h>
int main(void)
{
    int a[3][4] = { {1, 4, 2, 8}, {6, 4, 7,2}, {2, 3, 6, 4} };
    printf("%d \n", a + 1);            //1
    printf("%d \n", *(a + 1));         //2
    printf("%d \n", (a + 1)[0]);       //3
    printf("%d \n", (a + 1)[0][0]);    //4
    printf("%d \n", *(a + 1)[0]);      //5
    return 0;
}

1>C:\Users\94497\source\repos\实验\源.cpp(10,9): warning C4477:  “printf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“int (*)[4]”        //1
1>C:\Users\94497\source\repos\实验\源.cpp(11,9): warning C4477:  “printf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“int *”             //2

11991476        1
11991476        2
11991476        3
6               4
6               5
C:\Users\94497\source\repos\实验\Debug\实验.exe (进程 4552)已退出,返回代码为: 0。
按任意键关闭此窗口...

宝剑锋从磨砺出,梅花香自苦寒来。
2019-08-29 21:03
c小白2333
Rank: 5Rank: 5
来 自:中国
等 级:贵宾
威 望:11
帖 子:121
专家分:367
注 册:2019-6-17
收藏
得分:0 
a+1和*(a+1)虽然都是地址
但是他们的类型是不同的
*(a+1)虽然不能直接访问其中的值但是把行数确定下来了
a+1 行数未确定 需要和后面第一个[]来确定行  
仅个人见解  仅供参考

宝剑锋从磨砺出,梅花香自苦寒来。
2019-08-29 21:09
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:4 
不要太关注数组的名字,重点放在数组的元素,这样会更清楚些。
数组的地址是数组元素的地址,数组第一个元素的地址就是所谓的“数组首址”。
定义一个与数组元素类型相同的指针并指向数组元素,这样用指针来操作数组就简单明了。
2019-08-30 05:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:4 
例如有个整形数组a[3][4],数组名a就是地址了
----- 数组可隐式转换为指针,但数组就是数组,数组名不是地址。

a+1表示第1行首元素的地址
----- 数组a降级为指针后等同于 &a[0],因此 a+1 等同于 &a[0]+1,也即等同于 &a[1]

但是输出时前加*的意义却不是输出这个地址中存放的元素,而是又输出了这个元素的地址
------ 这我就不知道你在说什么了,估计你说的是printf,但printf从未提供过打印数组的功能

a+1和*(a+1)表示的含义是完全相同的
------ 最起码类型就不一样,a+1 (也就是&a[1])的类型是 int (*)[4],而 *(a+1) (也就是a[1])的类型是 int[4]。
2019-08-30 08:40
拼尽全力
Rank: 1
等 级:新手上路
帖 子:5
专家分:4
注 册:2019-7-31
收藏
得分:4 
回复 4楼 吹水佬
“定义一个与数组元素类型相同的指针来操作数组”,您的这句话我不是很能理解。。如下:
int a[2][3]={{1,2,3},{4,5,6}};
int*p=a;
这难道不是与数组类型相同的指针吗?但是 无法从 int a=[2][3] 类型转换成 int *;
为啥定义一个数组指针就可以?
int (*p) [3]=a;
为啥数组指针后面只有写二维数组的列即[3]才可以,行却不可以?

2019-09-02 19:19
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用拼尽全力在2019-9-2 19:19:18的发言:

“定义一个与数组元素类型相同的指针来操作数组”,您的这句话我不是很能理解。。如下:
int a[2][3]={{1,2,3},{4,5,6}};
int*p=a;
这难道不是与数组类型相同的指针吗?但是 无法从 int a=[2][3] 类型转换成 int *;
为啥定义一个数组指针就可以?
int (*p) [3]=a;
为啥数组指针后面只有写二维数组的列即[3]才可以,行却不可以?

对于 int a[2][3],a只是数组的名字,不是数组的指针,如果执着把数组的名字当指针就不好搞清楚了。
a[2][3]只是编程语言的语句表达形式,实质是连续的一块空间用来存放6个数组元素的数据。第一个元素的数据地址才是数组的首地址,就是&a[0][0]。
“定义一个与数组元素类型相同的指针并指向数组元素”,就是说对于数组a元素的数据类型int,定义一个int类型的指针,即int *p。用p来操作数组,要操作那个元素就指向那个元素,即p=&a[0][0]、p=&a[1][1].....
至于所谓的数组行列,也是语句的表达形式,方便对现实的阅读和理解。数组的数据是连续存放的一整块,数组的行列只是按小块划分。
2019-09-02 21:54
暴君Dentiny
Rank: 2
等 级:论坛游民
帖 子:132
专家分:43
注 册:2019-5-6
收藏
得分:4 
额,八仙过海

技术至上,学无止境
2019-09-02 23:00
q386863114
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2019-7-19
收藏
得分:0 
回复 5楼 rjsp
您看下2楼的回复里的代码,我的意思就是printf  a+1输出的是一个地址,a+1里面存的应该是一个地址,*号不是代表取内容的意思么,那么printf *(a+1)为啥不是输出这个地址里的内容呢,却又输出的是地址。
2019-09-14 20:25
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:0 
#include "stdio.h"
void main()
{  int a[3][4];
    printf("%d,%d,%d,%d,%d",a+1,a,*a,*a+1,*(a+1));
}
这段能看出区别。

[此贴子已经被作者于2019-9-14 21:49编辑过]


我是硬件工程师
2019-09-14 21:28
快速回复:关于指针的一些疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022043 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved