c语言中把指针p指向数组a(c语言数组指针和指针数组的区别)

admin 437 0

大家好,今天小编来为大家解答c语言中把指针p指向数组a这个问题,c语言数组指针和指针数组的区别很多人还不知道,现在让我们一起来看看吧!

一、C语言选择题,关于指针数组。求详解

1、int a[2][3];定义了一个二维函数,每一维数组有三个元素。

2、int(*pt)[3];定义了一个数组指针,也就是定义了一个指向有三个元素的指针,即该指针,每次自加1,地址跳过三个int

3、pt=a;就是让pt指向a[0],注意a[0]是一个数组地址,里面有三个元素

4、对于A选项,pt[0][0]是正确的,pt[0][0]等价于a[0][0]

5、对于B选项,不正确,因为pt+1就是a[1],*(pt+1)[2]相当于a[3][0]不对。

6、因为运算符优先级,[]大于*,因此*(pt+1)[2]就是*pt[1+2]也就是*a[1+2]。而*a[3]就等价于a[3][0]。越界了

7、改成(*(pt+1))[2]就对了,相当于a[1][2]

8、对于C选项,正确,*(pt[1]+2)相当于a[1][2]

9、对于D选项,正确,*(a[0]+2)相当于a[0][2]

二、C语言中数组指针关于p=a,p=&a等问题!!

1、问题1:一维数组名与二维数组名含义是不一样的,当然跟你理解的指向行或者列是有一定的偏差的。

2、对于一维数组,比如int a[4],a代表的是int型的指针,其地址指向a[0],对于二维数组比如a[2][4],a代表的是也是指针,只不过不是简单的int型指针,而是你代码中的数组指针,它与一维数组中指针的区别是:当一维数组名a++时(即步长),指针移动字节数为int型数据所占字节数,但是对于二维数组中a++时,指针移动字节数为列数乘以int型数据所占字节数,即4(代表数组有4列)乘以sizeof(int)。

3、问题2:先说一下&a代表的意思。假设数组为int a[4]

4、对于一维数组&a代表的是int型数组指针,它与a的区别是a是int型指针,但是&a代表是int型数组指针,&a的步长为以为数组大小乘以int型数据所占字节数,所以当p= a时,这两个类型不匹配,因为p为int型数组指针,a为简单int型指针,对于表达式p=&a,这个表达式刚好类型匹配,它们的步长都是(4* sizeof(int))。

5、问题3:对于int(*p)[4]代表的是int型数组指针,步长是(4* sizeof(int))。首先说明的是对于第7行程序打印的结果不是a[3]对应的值,这样的操作属于越界(即访问到数组外的内存)。对于(*p)[3]表达式代表*(p+ 3),因为p步长为16字节(假设int型数据占4字节),所以*(p+ 3)其实访问的是数组首地址加上16乘以3地址处的数据。

6、问题4:对于二维数组int a[2][4]以及int(*p)[4],因为a与p都是int型数组指针,所以类型匹配,所以对于第6行:p= a即可,如果想输出a[0][3],用printf("%d\n",*(*(p)+ 3));即可。对于二维数组而言,存在&a的语句,它同样是数组指针,其步长是行数乘以列数乘以int型所占字节数,对于

7、int a[2][4],&a的步长为2* 4* sizeof(int)。

8、问题:对于二维数组*score它也是一个指针,并且是个数组指针,如果改成&score以后,虽然都是数组指针,但是步长不一致,编译器会报警告。

三、c语言指针引用数组元素,从p=a开始解释下此程序

1. p=a;//使int*指针p指向数组a的首元素,即a[0]的地址—&a[0]。

2.第一个for循环语句,就是通过指针p来对数组a的各个元素赋初值,*p的意思就是获取指针p所指向的内存单元的值,初始就是对a[0]赋初值i,*p++=i,等价于:

*p=i;//对p指向的当前数组元素赋值,等价于a[i]=i;

p++;//指针p自增1,使指针p指向下一个数组元素

3. p=a;//使指针p重新指向数组a的首元素,即指向a[0]。

4.第二个for循环,就是通过指针p输出数组a的所有元素到屏幕上了。

总结,通过指针来操作对象,是一种间接访问变量的方式,有很多的好处,这在以后的编程学习中你会慢慢体会到指针的妙处和精髓。

四、c语言指针指向数组的问题。

1、首先你要明白一点,数组名和指针本质上是一回事,都是地址,该数组的首地址。知道这一点后就可以活学活用了。这是c语言的精髓。

2、这个操作叫做指针p指向了数组a,其本质是给p这个变量付了一个值,就是数组a的地址,也是a[0]的地址,也是a本身里面存储的内容。

3、那么要引用a[i],你可以有很多种写法,比如*(a+i),

4、p++的含义其实不是p=p+1,至少有时不是,p++的操作其实是让p指向下一个元素,也就是原来p指向的是a[0],那么现在p指向a[1]了。由于a是int类型,站4个字节,那么p++这个操作其实是让p的内容增加了4。不要问为什么,c语言就是这么规定的。如果p指向的是一个char类型,那么p++就使p的值增加1。

五、C语言中二维数组行指针是什么

1、先从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。

2、第一,来详细介绍二维数组与指针的关系。-

3、首先定义个二维数组 array[3][4],p为指向数组的指针。

4、若p=array[0],此时p指向的是二维数组第一行的首地址,则 p+i将指向array[0]数组中的元素array[0][i]。由以上所介绍的二维数组在内存中的存储方式可知,对数组中的任一元素array[i][j],其指针的形式为:p+i*N+j(N为每一行的长度)。元素相应的指针表示法为:*(p+i*N+j),下标表示法为:p[i*N+j]。

5、array[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

6、数组array有四个元素,分别为array[0],array[1],array[2],array[3],每个元素为包含3个元素的一维数组,

7、如array[0]的3个元素为 array[0][0],array[0][1],array[0][2]。

8、元素array[2][2]对应指针为:array+2*3+2,

9、指针表示法为:*(array+2*3+2),

10、特别注意:虽然 array[0]与 array都是数组首地址,但两者指向的对象不同,这点要非常明确。array[0]是一维数组的名字,它指向的是一维数组array[0]的首地址,所以*array[0]与array[0][0]为同个值。而 array是二维数组的名字,它指向的是所属元素的首地址,其每个元素为一个行数组。它是以‘行’来作为指针移动单位的,如array+i指向的是第 i行。对 array进行*运算,得到的是一维数组 array[0]的首地址,所以*array与 array[0]为同个值。如果定义 int* p,p为指int类型的指针,指向int类型,而不是地址。故以下操作:p=array[0](正确),p=array(错误)。这点要非常注意。

11、第二,看看如何用数组名作地址表示其中元素。

12、对二维数组array,array[0]由 array指向,故*array与array[0]是相同的,依次类推可得 array[i]由array+i指向,*(array+i)与array[i]是相同的。因此,对于数组元素 array[i][j],用数组名表示为*(*(array+i)+j),指向该元素的指针为*(array+i)+j。

13、注意:数组名虽然是地址,但与指向数组的指针性质不同。指针变量可以随时改变其所指向对象,而数组名不可以,一旦被定义,就不能通过赋值使其指向另外一个数组,但是在Java中则可以。

14、第三,顺便了解一下不太常用的‘行数组指针’。

15、对于二维数组array[4][3],与int* p。二维数组名array不能直接赋值给p。原因前面已讲过,两只的对象性质不同。在C语言中,可以通过定义一个行数组指针,使得这个指针与二维数组名具有同样的性质,实现它们之间可以直接赋值。行数组指针定义如下:

16、int(*p)[3];它表示,数组*p具有三个int类型元素,分别为(*p)[0],(*p)[1],(*p)[2],即 p指向的是具有三个int类型的一维数组,也就是说,p为行指针。此时,以下运算 p=array是正确的。

17、二维数组作为函数参数一般有两种方式:(1) void func(int**array){...}(2) void func(int array[ ][N])

18、注意第二种方式一定要指明二维数组的列数

19、当二维数组名作为函数实参时,对应的形参必须是一个行指针变量。

20、和一维数组一样,数组名传送给变量的是一个地址值,因此,对应的形参也必须是一个类型相同的指针变量,在函数中引用的将是主函数中的数组元素,系统只为形参开辟一个存放地址的存储单元,而不可能在调用函数时为形参开辟一系列存放数组的存储单元。

六、C语言中用指针变量指向数组元素

1、数组名并不是一个普通的变量,而是一个指向数组首元素的指针。也就是说,我们可以用数组名来初始化一个对应类型的指针。虽然数组名是指针,但它是一个指针常量。也就是说,不带下标的数组名不能作为左值。指针是一种数据类型,所以,我们可以用指针类型来创建一个数组。声明一个指针数组的语句格式是:

2、对指针数组的操作和对指针变量的操作并无不同.

OK,关于c语言中把指针p指向数组a和c语言数组指针和指针数组的区别的内容到此结束了,希望对大家有所帮助。