C语言中的“行指针”与“元素指针”有什么区别

2020-11-23 09:31:55 字数 6501 阅读 8789

1楼:键盘雀跃

int a[4]=

1 2 3 4

^ ^

a[0] a[1] a[2] a[3]a是一维数组名,代表数组的首地址.也就是a[0]*(a+1) 指针移动2个字节,指向下一个数组元素,就是a[1]int a[3][4]=,,}

^ ^

*a[4] 或a[4] 或a[3][4] 都可以表示行指针.操作a是二维数组名,代表二维数组的首地址,也就是a[0][0] = 1

*(a+1)[4] 指针指向a[1][0] = 5 ,也就是指向下一行数组元素的首地址.一次跳跃到下一行.

c语言的行指针与元素指针有什么区别?

2楼:匿名用户

先举个例子吧,先定义一个二维数组int a[3][4]=,,}数组名a就是一个行指针,a[0]就是一个列指针;

就拿这个例子说吧,a和a[0]虽然地址相同,可是指针指向类型却不同,对指针进行+1运算,显然得到的结果是不同的,因此a(行指针)+1中的"1”代表一行中全部元素所占的字节数,而a[0]+1,这里的1则是一个元素所占的字节数,是两个不同的概念。

为了说明这个容易搞混的问题,可以用军训中排队点名来说明。班长逐个检查本班战士是否在队列中,班长每移动一步,走过一个战士,而排长点名只检查本排各各班是否到齐。排长只从第0班的起始位置走到第1个班的起始位置,看来只走了一步,但实际上他跳过了10个战士,这相当于a+1,班长面对的战士,排长面对的是班,班长相当对列指针,排长相当于行指针。

为了找到某个班内的某一个战士,必须给出两个参数

3楼:键盘雀跃

^int a[4]=

1 2 3 4

^ ^

a[0] a[1] a[2] a[3]a是一维数组名,代表数组的首地址.也就是a[0]*(a+1) 指针移动2个字节,指向下一个数组元素,就是a[1]int a[3][4]=,,}

^ ^

*a[4] 或a[4] 或a[3][4] 都可以表示行指针.操作a是二维数组名,代表二维数组的首地址,也就是a[0][0] = 1

*(a+1)[4] 指针指向a[1][0] = 5 ,也就是指向下一行数组元素的首地址.一次跳跃到下一行.

4楼:匿名用户

行指针与元素指针的区别实质上就是指 【数组】与【普通指针】的区别。

区别:1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。

2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常用指针来操作动态内存。

3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

5楼:匿名用户

行指针是指向一行的,假设指针为p,那么p++就向下移m*d(m为那一行的元素个数,d每个元素占的内存单元)

指向元素的指针 p,那么p++就是指向下一个元素

也就是说p移动的字节不一样

c语言中的列指针是指向元素的指针吗,怎么区别行指针与列指针

6楼:村驴

二维数组的数组名a和a+1、a+2是行指针,它指向的元素是一个包含4个元素的一维数组,而*a、*(a+1)、*(a+2)是列指针,即指向元素的指针,相当于一维数组中指向特定元素的指针。*(*(a+1)+2)是先竖着走一行,再横着走两行,相当于a[1][2]。&a[1][0]就是a[1][0]的地址,相当于*(a+1),是一个列指针。

7楼:这个名有人取了

这个三言两语说不太清楚,推荐你看看这篇博客

http://blog.csdn.***/haussuden/article/details/5965304望采纳

c语言中,指针数组和行指针的区别是什么?

8楼:藏天地

int(*p)[4],这个就是行指针

这种类型的指针p是指向一个一维数组,这个一维数组包含4个整形元素

但是 int a[4];p=a; 这种方式却是不对的

因为p只能指向一个整型的一维数组,不能指向一个整型数据,a所指向的正是a[0],是个整型数;

实际上int(*p)[4]这种类型的指针是用于多维数组中的,比如定义一个二维数组int b[3][4],就可以这样赋值p=&b[0],使p指向一维数组b[0],而且p的增减是以一维数组的长度为单位的,比如p+1指向的就是b[1]了

int *p[4]这个是指针数组了,首先弄明白这个是数组,里面存放的是指针也就是地址,这个地址所指向的是一个整型数据,你可以把p[0],p[1]....当作一个个的指针变量来使用

我学的时候也弄了半天才搞明白,这是我总结的,你多看看指针那关于多维数组与指针的一节,做些练习自己验证几次就容易弄明白了

9楼:匿名用户

简单的说就是一个是指向数组的指针,一个是数组成员是一族指针

具体哪个是哪个我也时常分不清楚。但用起来就知道了

c++中“指向行的指针”是什么指针?与普通指针有什么区别?

10楼:樂灬天

“指向行的指针”,它指向的内存里面存放的

依然是指针,而普通指针指向的内存里面存放的是相应类型的数据,比如普通指针int *p,p指向的内存存放的是int型数据;而int (*p)[5],其中p指向的内存存放的还是指针,该指针指向一个存放5个数据的数组,可以理解为指向行。

c语言什么叫行指针?它与数组指针有什么联系和不同点?

11楼:血殿下

数组指针就是一个数组的地址, 行指针出现在二维数组里就是是二级指针那里附近,例如 int a[10][5]; 那么二维数组可以可分为行和列,那么要找到每一个数组就要通过哪行和哪列查找,a[10][10]中第一个小标表示行,第二个下标表示列,那么 a[1],a[2]表示对应行的指针,记得在二维数组中约定a[1],a[2]表示的是指针,在一维数组中a[1],a[2]表示的是元素,我知道你云里雾里的这里比较难记住既可以了,不要问为什么,记得这是语法规定的就可以了

12楼:手机用户

行指针是一种形象的说法,比如现在有x行x列的**。p指针指向第一行,行指针特点就是比如p+1,那么p就指向下一行的首地址。普通指针+1 就指向下一个,注意是下一个地址。

行指针是指向下一行。

c语言中用指针和用下标访问数组元素的本质区别

13楼:匿名用户

两者意思一样,但是编译器处理起来不见得一样。就像楼上的例子a[2]跟*(a+2)是一个意思。但是对于编译器来说a[2]是一种固定的写法,因此对于地址偏移什么的有固定的处理方式,而*(a+2)在语法上应当分解为先算a+2再取值,如果编译器不优化,完全按照这种定义去编译的话,那么就会有先算出a+2这个地址这一步,因此效率要低些。

至于编译优化能不能使两者一致,那就很难说了。

比如我编了这样一个程序

int a[100];

int b;

int i,j,k;

for(i=0;i<1000000;i++)}}和把b=a[0]换成b=*(a)所耗时间一样。而分别换成b=a[k]和b=*(a+k)后者所耗时间明显增加很多,前者也有所增加,但比较少。编译器优化不能用这个语句测试,因为整个会被优化掉。

14楼:匿名用户

只有语法有区别

本质没有区别,本质c是把数组当作指针来用的。

比如说下面的定义:

int a[3];

2[a]=10;

这样是合法的。

2[a] = 10被翻译成*(2+a)=10; 等价*(a+2)=10;等价于a[2]=10;

不过别这么写。over

15楼:匿名用户

胡海涛 21栋强势围观,不要以为我们不知道是你问的,我要告诉c语言老师!你惨了。

16楼:匿名用户

21栋109前来围观

17楼:低调地淡定

无论指针指向的内容有多大,指针都只有4个字节。从内容上来看,存取指针占用空间小。

另外,数组名本身就可以当做是一个地址,所以指针访问与下标访问,并无多大区别。

18楼:曾哥铁血史泰龙

21栋110围观楼主杯具..

c语言的行指针的定义 int (*p)[3]; 和字符型数组指针数组的定义 int *p[3]有什么区别吗,我有点模糊。

19楼:匿名用户

int (*p)[3] =

(int*) (int) (int) (int)int* p[3] =

(int) (int*) (int*) (int*)

20楼:

有区别:

前者:是数组指针 该指针指向的数组中所有数据都是int

后者: 指针数组,数组中所有数据都是int*

21楼:匿名用户

有区别的,第一个里面是数组指针 该指针指向的数组中所有数据都是int

(p是一个指针,指向的是一个含有三个元素的整形数组)。第二个里面p是一个指针数组的数组名,这个数组里面存的是整形的指针。

22楼:驿路惊鸿

先级高于*,所以int *p[3]说明p是一个数组,含有3个元素;每个元素都是一个int型指针(三个元素都是指针)。

int (*p)[3]中,p是指向有3个int型元素的数组的指针(三个元素,数据)。

23楼:匿名用户

有区别的,第一个里面p是一个指针,指向的是一个含有三个元素的整形数组。第二个里面p是一个指针数组的数组名,这个数组里面存的是整形的指针。

c语言中:数组指针与指针数组有什么区别?

24楼:匿名用户

数组指针是指向这个数组首地址的指针,指向对象是这个数组;

指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;

例子:int a[10];

int* s;

s = a;//这里s就是一个数组指针,它的值就是数组a 的首地址;当然,如果a是一个整数,那s就是一个指向整型的指针;

int a;

int* s[5];

for(int i=0;i<5;i++)s[i]=a;

//这里s就是一个指针数组,它的每个元素都是整型变量a的地址应该算比较明白了吧

谢楼上提醒

25楼:天云一号

int (*p)[4]; // 定义一个数组指针,指向含4个元素的一维数组,数组元素是int类型。

int *p[4]; // 定义一个指针数组,数组中每个元素是一个指针,指针指向**就要根据程序来定了。

判断数组指针与指针数组主要通过运算符的优先级来判断。

int (*p)[4]; // 由于( )的优先级高,说明p是一个指针,指向一个一维数组的指针

int *p[4]; // 由于[ ]的优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组

26楼:匿名用户

1.大概说一下这三种

int * a; 这叫整型指针 这玩意儿不能指向数组,搞清楚指向的是数组首元素

int (* b); 这叫整型数组指针 意思是指向数组的指针

int * c[5]=null; 这叫整型指针数组 意思是储存指针的数组

下来举个例子,理解一下:

2.定义一个数组,下面举例解释

int i[5]=;//定义整型数组,五元素皆为0

int n[5][5]=;//定义二维数组

3.三种分别举例

(a的例子)

a=i; //这里i是数组名,i相当于&i[0]。数组名相当于是数组i的首地址。此时* a指向数组i首元素。

a++;然后输出就是i[1]的值

(b的例子)

b=n; //二维数组名相当于n[5]这个数组,注意这块儿,这块儿最难搞清楚。n代表的不是第一行第一个元素的地址,而是代表第一行元素的所有地址的数组。这块的指针数组b相当于存放了n数组第一行的所有元素的地址。

//这块的数组指针b和上面的指针a比较,a指向的是数组的首元素,而b指向的是整个数组(或者说是存放了整个一维数组的多个元素(二维数组由一维数组构成,二维数组的第一行即是一个一位数组))

然后我们输出(* b)[2]相当于输出了n[0][2]

如果b++然后输出(* b)[2]相当于输出了n[1][2]

c的玩法:

太简单了,不想说了。就是存放多个指针的数组,自己想想。

c语言中数组名和指针变量的区别,C语言中数组名和指针的区别

1楼 销 数组名除了sizeof会返回数组大小,其他的实况下是相当于一个指针常量无区别的 指针常量也就是说,不能改变数组名的值,比如int a 10 a a a a 10等都是非法的 c语言中数组名和指针的区别 2楼 匿名用户 数组在当作参数传递时,可以当作指针 当然,参数传递相当于赋值操作,所以用...

“指针的类型”和“指针所指向的类型”有什么区别

1楼 匿名用户 你说的对,在32机器里,指针的容量就是4字节的。指针的类型实际上就是指针所指向的变量的类型。 为什么在声明指针的时候要声明出它所指向的变量的类型呢? 因为,例如 int p 在以后的程序中有可能要做 int a p的操作,所以 ,即取值操作就要知道p所指向的空间里存放的变量的类型,根...

c语言中的和两个运算符有什么区别

1楼 匿名用户 在c语言中,运算符 和运算符 所表示的意义不同。 是赋值运算符,它的含义是将右侧表达式的值赋给左侧的变量。 是关系运算符,如果两侧表达式的值相等,则其值为1,否则为0。 2楼 匿名用户 一个等号是赋值运算符,用于把等号右边的结果赋值给左边的变量 两个等号是判等运算符,用于判断等号左右...