数组指针,指针数组区别!要详细,超详细!我区分了好多次了,还是不清楚啊
1、在c和c++中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。
2、指针数组是指一个数组中的每个元素都是一个指针,也就是多维数组。
说白了,数组指针就是指指向数组首地址的指针,也可以说是数组的首地址。而指针数组,按字面意思,指针的数组,存放指针的数组,也就是数组中每一个元素都是指针,即多维数组。
总而言之,数组指针是指一个指针,而指针数组是一个多维数组。
例子:int a;int (*p);int *p
第一个,是指针数组,a可以看成是存放三个指针的数组a,且每个指针指向一个存放4个整型数据的数组。
第二个,int (*p);这个和第一个例子的表达的意思一模一样,我们可以这样赋值:
int (*p)=a;其中p表示指向存放4个整型数据数组的指针,不过它没有给出指针的具体定义,所以我们还可以用这样赋值来理解:
若int b[n];(n为int数据)则int (*p)=b;(p也是指向一个存放4个整型数的数组,但这里有n个p指针!)。
第三个,int *p;它定义了一组存放三个指针的整型数组,我们可以近似地理解:
如int *q;(定义了一个q指针);
int *p;(定义了一组指针)。(这一组指针的定义等同于这样三个指针的定义:int *x,*y,*z。)
指针数组与数组指针的区别是什么麻烦详细点
指针数组:array
of
pointers,即用于存储指针的数组,也就是数组元素都是指针
数组指针:a
pointer
to
an
array,即指向数组的指针
还要注意的是他们用法的分别,下边举例表明。
int*
a
指针数组
表明:数组a中的元素都为int型指针
元素表明:*a[i]
*(a[i])是相同的,由于优先级高于*
int
(*a)
数组指针
表明:指向数组a的指针
元素表明:(*a)[i]
指针数组和数组指针的区别
数组指针--指向数组的指针,是一个指针,其指向的类型是数组;指针数组--元素为指针的数组,是一个数组,其中的元素为指针。仔细研读下面的程序:
#include 《stdio.h》
int
main(void)
{
int a = {{1,2},{3,4}};
int (* p);
char * s = {“hello“, “world“};
p = a;
printf(“%d, %d, %d, %d\n“, (*p), (*p), (*(p+1)), (*(p+1)));
printf(“%s %s\n“, s, s);
return 0;
}
顺便指出楼上犯的错误a++ = i;是错的,不信自己把你的程序跑跑看。正确的应该说
int a;
for(i = 0; i 《 10; i++)
{
a[i] = i;
}
与
for(i = 0; i 《 10; i++)
{
*(a+i) = i;
}
是等价的!
指针数组和数组指针(行指针)有什么区别
数组指针(行指针)全称是二维数组的指针,只能操作二维数组,又因为操作二维数组是以行为单位,所以又名行指针,如(*a)是指一个每行有3个元素的二维数组,即3列,行数未定
指针数组是一个数组里面的所有元素都为指针,如*a是将*a、*a、*a这三个指针打包用数组存放,相当于3个指针
数组指针和指针数组的区别
数组指针,是指向数组的指针。通常所说的数组指针,只是一个指针,他只能存放一个地址。一般用于多维数组。
举例说明,假设有一个四行五列的二维数组A,C语言认为它是由四个五元素的一维数组首尾相连组成的。当定义一个数组指针P时,让p指向二维数组的首地址,其实他指的也是第一个一维数组的首元素地址,当执行P+1之后,P就指向了第二个一维数组的首元素地址,或者p再+2以后就指向了第四个一维数组数组的首元素地址。
int a={{1,2,3,4,5},{6,7,8,9,10}}
(*p)=a;
则*(*(p+1)+1)代表第二行的第二个元素7。
指针数组是由若干指针组成的数组,它是一组指针,而不是一个指针。它和普通的数组一模一样,只是它存放的是指针,也就是地址,而不是元素的值。
如:
int a=2,b=3,c=5;
int*p;
p=&a
p=&b
p=&c
则*p,*p分别代表3和5。
有什么问题请留言。
数组指针和指针数组有啥区别
1 这两种形式没有任何区别,定义的都是char* 类型的指针,不过有的书上建议采用*和变量相靠近的写法,这样可以避免连续声明时的错误,例如:char *ptr,a;可以明显知道一个是指针的变量一个是char类型的变量。
2 二维数组实际可以声明成指向指针的指针。这样在接受形参的时候,就可以用一个双重指针来接受。
void f(int **a) //怎么写?
{
}
int a;
f(a);
3 返回值是一个指针就可以实现了,不过返回的地址一定要是在堆空间申请的空间,或者是在静态区的空间。不要返回在函数栈中的地址,以防止在退出函数时,栈空间释放,成为幽灵内存。
char* fun(){
char* ptr =“abc“;
return ptr;
}
数组指针和指针数组有什么区别
数组指针和指针数组的区别
数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a;
int (*p); //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a或&a
p++; //该语句执行过后,也就是p=p+1;p跨过行a指向了行a
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义 int *p[n];
优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p、p、p…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p;
int a;
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i《3;i++)
p[i]=a[i]
这里int *p 表示一个一维数组内存放着三个指针变量,分别是p、p、p
所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
优先级:()》》*