| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1447 人关注过本帖
标题:关于指向一维数组的指针的小问题
只看楼主 加入收藏
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
收藏
已结贴  问题点数:10 回复次数:11 
关于指向一维数组的指针的小问题
定义一个指向一维数组的指针,int(*p)[4],已经让其指向一个一维数组,那么请问能进行以下运算吗:
(*p)++,*p=*p+1,
编译显示这两个语句错误,为什么?难道其指向一个数组后就是常指针,不能再被赋值以及自增
2017-02-12 16:18
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
但是你这个 int (*p)[4] 是二维数组的指针啊。。。
一维数组定义直接指针 *p 就是了,你多了(*p)[4] 那个表示二维了。
这样的二维*p里没有被赋值元素是不确定的值,而且(*p)++可理解为由p[0][0]跳到p[1][0]的地址的值,也就是一个不确定的地址了。
2017-02-12 17:37
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 2楼 kin3z
多谢你的答复,但您的看法不对吧,(*p)[4]本来的定义是指向包含四个元素的一维数组,您所说的指向二维数组,比如str[4][4],您所说的指向二维数组实际不准确,应该是指向str[i],i=0,1,2,3,其实是就是指向一维数组,并且我的书上有这样一段代码:
int a[4]={1,3,5,7};
int(*p)[4];
p=&a;
printf("%d\n",(*p)[3]);
不信您可以自己运行下,所以问题应该不在这

............
2017-02-12 19:35
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:3 
你说得对,其实p就是静态数组a。
至于你要自加运算,看以下测试实现:
程序代码:

    #include <stdio.h>

    int main(int argc, char **argv)
    {
        int a[4]={1,3,5,7};
        int(*p)[4];
        p=&a;    //问题这里,数组名a是一个地址,而你把&a赋值给p,也就是把a地址的地址给p
        
        printf(" p0 = %d\n",*(*p));    //于是,要解a需要用到2次解地址符*
        printf(" p1 = %p\n",*p+1);    //至于p1元素,它保存的值为一个地址
        printf("*p1 = %d\n",*(*p+1));    //获取这个地址的值需要*
        
        p = *p+1;
        
        printf(" p0 = %d\n",*(*p));    //此时的p0应该等于p1的值3了        
        
        return 0;
    }




最后这可能就是指针数组一般用char而不用int类型的原因,因char可以用结束符来判断结束,而int则需要额外用个数来记录结束

[此贴子已经被作者于2017-2-12 22:15编辑过]

2017-02-12 21:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
int(*p)[4];也可以看成是声明指向一个由4列int类型组成的二维数组指针p,p的大小属性为4*sizeof(int)。
如:
#include <stdio.h>
main()
{
    int a[][4]={{1,2,3,4},{5,6,7,8}};
    int (*p)[4];
    p = a;
    int i, j;
    for (i=0; i<2; i++,p++)
    {
        printf("p=%d %d\n", p, *(*p));
        for (j=0; j<4; j++)
           printf("%d ", *(*p+j));
        printf("\n");
    }
}


2017-02-13 08:18
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 4楼 kin3z
您的程序自己没有运行过吗,我试了下,出现了警告,说是不匹配的指针类型,问题就在p=*p+1,等式右边是列指针,是a[1]的地址,而等式右边是行指针,是指向整个一维数组的。并且,如果说我说的p指向一个一维数组后就是常指针,怎么能进行赋值???

............
2017-02-13 15:25
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 5楼 吹水佬
所以我提出的语句错误原因到底是什么,p是常指针吗???请正面回答

............
2017-02-13 15:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:2 
int (*p)[4];
(*p)++; // 这是什么意思? *p 的类型是 int[4],然后一个数组进行++ ?不懂
2017-02-13 15:34
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 8楼 rjsp
哈哈,谢了,你说这个我突然想通了,我原来的问题就不用回答了。就是还想问:p++可以吗???

............
2017-02-13 16:31
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
以下是引用邹特强在2017-2-13 15:26:29的发言:

所以我提出的语句错误原因到底是什么,p是常指针吗???请正面回答

“int(*p)[4];也可以看成是声明指向一个由4列int类型组成的二维数组指针p,p的大小属性为4*sizeof(int)。”
这句已经正面回答了这个指针p的实质:指针的两个重要属性“地址”和“大小”。
初接触指针时可能不太重视指针的“大小”属性,凡是指针p都误认为可以用*p去运算。
就如 int(*p)[4],p的大小属性为4*sizeof(int),是由4组int数据组成的类型(有点象结构类型),p是指一组数据,而不是象 int *p 的p只是指某个数据,此时就不能用*p来表达这组数据的运算。
所以,(*p)++; 和 *p=*p+1; 语句此时是不合法。
2017-02-14 08:09
快速回复:关于指向一维数组的指针的小问题
数据加载中...
 
   



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

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