数组和指针之间有什么关系吗 数组和指针的区别与联系 详细

数组和指针之间有什么关系?

1、指针:系统为某一个变量开辟单元格,指针便指向此单元格的变量值。

2、数组:系统为某一组数开辟一组单元格,数组首地址便是你定义的数组变量名。

数组和指针的唯一区别是,不能改变数组名称指向的地址。

对于数组来说,数组的首地址,也可以用指针来表示操作,如:

int a[10];

int *p,n;

p = a;

对第一个元素取值,可以用几种方法:

n =a[0];

n = *p;

n = p[0];

n = *(p+0) ;

但是以下语句则是非法的:

readings = totals; // 非法!不能改变 readings totals = dptr; // 非法!不能改变 totals

数组名称是指针常量。不能让它们指向除了它们所代表的数组之外的任何东西。

扩展资料

下面的程序定义了一个 double 数组和一个 double 指针,该指针分配了数组的起始地址。随后,不仅指针符号可以与数组名称一起使用,而且下标符号也可以与指针一起使用。

int main()

{

const int NUM_COINS = 5;

double coins[NUM_COINS] = {0.05, 0.1, 0.25, 0.5, 1.0};

double *doublePtr; // Pointer to a double

// Assign the address of the coins array to doublePtr

doublePtr = coins;

// Display the contents of the coins array

// Use subscripts with the pointer!

cout << setprecision (2);

cout << “Here are the values in the coins array:n”;

for (int count = 0; count < NUM_COINS; count++)

cout << doublePtr [count] << ” “;

// Display the contents of the coins array again, but this time use pointer notation with the array name!

cout << “nAnd here they are again:n”;

for (int count = 0; count < NUM_COINS; count++)

cout << *(coins + count) << ” “;

cout << endl;

return 0;

}

程序输出结果:

Here are the values in the coins array: 0.05 0.1 0.25 0.5 1 And here they are again: 0.05 0.1 0.25 0.5 1

当一个数组的地址分配给一个指针时,就不需要地址运算符了。由于数组的名称已经是一个地址,所以使用 & 运算符是不正确的。但是,可以使用地址运算符来获取数组中单个元素的地址。

延伸阅读

c语言数组和指针的问题?

数组指针是指向这个数组首地址的指针,指向对象是这个数组;指针数组是存放一类指针的数组,这个数组的每个元素都是一个指针;

指针数组和数组指针的区别?

数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]所以要分别赋值。

这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

优先级:()>[]>*

如何在c语言二维数组中使用指针?

对于a[i][j](二维数组的大小为n×m)而言,首先要搞清楚行指针和列指针行指针:&a[i]或者a+i指向行,&a[i]=&*(a+i)=a+i列指针:a[i]或*(a+i)指向列,a[i]等价于*(a+i)元素的引用方式有如下三种方式1.通过地址引用二维元素*(&a[i][j]),*(a[i]+j),*(*(a+i)+j),*(a[0]+m*i+j)*(&a[0][0]+m*i+j)(*(a+i))[j]2.建立一个指针数组引用二维元素int *p[3],a[3][2],i,j;for(i=0;imain(){int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};int i,j;printf(“输入学生号:0-2”);scanf(“%d”,&i);printf(“the score of No.%d are:n”,i);for(j=0;jmain(){int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int *p;for(p=a[0];pmain(){int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};int i,j; printf(“输入学生号:0-2”);scanf(“%d”,&i);printf(“the score of No.%d are:n”,i);for(j=0;jmain(){int score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};int i,j,*p; printf(“输入学生号:”);scanf(“%d”,&i);printf(“the score of No.%d are:n”,i);for(p=score[i];p

指针数组和数组指针的区别是什么?

数组指针只是一个指针变量,它占有内存中一个指针的存储空间。而指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

指针数组: 指针数组可以说成是”指针的数组”,首先这个变量是一个数组,其次,”指针”修饰这个数组,意思是说这个数组的所有元素都是指针类型,在32位系统中,指针占四个字节。

数组指针: 数组指针可以说成是”数组的指针”,首先这个变量是一个指针,其次,”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。

数组名和指针的区别?

数组和指针的区别:数组名确实表示指向数组首地址的指针,但这个指针很特别,它的值(指针的值指的是指针所指的地址)不能被改写,能改写的仅仅是其指向的内容,换句话说,数组名只能指向数组的首地址,如果有数组char a[];那么如果出现a = a+1;这是编译都通不过的错误。而对于一个普通的指针是可以的,再比如有数组char a[];那么再定义一个char *p = a;然后再用p = p+1是合法的,这表示让指针p指向&a[1]。它们的第二个区别是:每当用到数组名这个指针的时候,系统都会传入数组的信息,而普通的指针只是一个4字节的整数,例如:

char a[5];char *p = a;//指针a和指针p都指向数组a的首地址cout << sizeof (a) << “##” << sizeof (p) << endl;

这时的运行结果是“5##4”

c语言指针数组怎么定义?

指针数组

1、什么是指针数组;

(1)数组里面的每一个元素不是值而是指针。

(2)把很多的指针集合在一起,就是一个指针数组

2、定义一个指针数组:

类型标识符 *数组名[长度];

比如:int *a[4];

定义了一个数组名为a,它里面含有几个四个元素,他们分别是a[0],a[1],a[2],a[3],它们每个都是一个指针。

3、如何给指针数组赋初值:

//其中a是一个普通数组,b是指针数组,即b数组当中的每一个值都是指针

int a[3] = {1,2,3},*b[3]={a,a+1,a+2};

printf(“%d”,*b[0]);

1

2

3

1

2

3

a ———-> a[0] <——–b[0]

c语言数组和指针的存储区别?

区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针。所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以就会觉得指针和数组名很像,但是必须要注意的是,数组名只是指针中的一种,它是指针中只指向栈区的且指针的移动范围是有限的,即数组长度。而且数组在定义之初就已经有了自己的内存,一般的指针如果未指向某一个内存块时,它是没有自己的内存的,即所谓的野指针。

联系:如上面所说,数组只是定义在栈区的一个连续变量,它的首地址就是一个指针。

总结:不仅数组有指针,所有变量都有指针,指针说白了就是内存中的地址,就像一个房间必须有一个房间号。在C/C++语言中定义一个指针,就是在栈区开辟一个内存空间用来存放它指向的内存地址,然后给指针赋值,就是把地址值赋值给刚才开辟的内存空间,然后通过访问该内存中的地址值来间接访问该地址下存放的数据。如果该地址值指向的是一块静态存储区,如字符串常量等,当然就不可以修改指向的内容啦。

c语言指针数组的用法?

一维数组指针

一维数组的指针是直接将一维数组的首地址赋予指针变量,之后通过指针变量的运算逐渐输出一维数组中的各个元素的值。

例如:int a[20];

int *p;

因为数组名相当于一个指针指向的就是一维数组的首地址(例如a[0]),所以可以直接将数组名赋予指针变量(例如p=a),无需加取地址符&;也可以让指针变量指向第一个元素的地址(例如p=&a[0]);即p=a与p=&a[0]是等价的,(应当要注意的是:p=a是将数组首元素的地址赋给指针变量,而非将数组a的各元素的值赋给指针变量)

如果一个指针变量p已经指向数组中的一个元素,则p+1指向数组中的下一个元素,p-1指向的是数组中的上一个元素。(注意:执行P+1或P-1时,并不是将P的值简单的加1,而是加上一个数组元素所占用的字节数,例如:float型,每个元素占4个字节,所以p+1意味着使p的地址加4个字节,以便让其指向下一个元素)

这里的a+i与p+i是等价的,也可以用数组名进行运算;

e

*(a+i)==*(p+i);

二维数组指针

令int a[2][3]={{1,2,3},{4,5,6}}

在二维数组中数组名指向数组的首元素,但是不是简单的表示一个简单的元素,而是由多个元素所组成的一维数组,因此数组名指的是二维数组首行(即下标为0的那一行)的首地址,a+1即表示下标为1的那一行元素,又因为数组名代表首元素的地址,所以a即代表二维数组中a[0][0]的值,a+1即a[1][0]的值。a[0]等价于*(a+0),a[1]等价于*(a+1),(a+1)+1的值即&a[1][1]。要想得到a[1][1]的值,就要再进行取值,即(a[1]+1)或*((a+1)+1)为a[1][1]的值。(注意:(a+i)与a[i]是等价的)

切记二维数组名是指向二维数组首行,而非指向二维数组a[0][0];

二维数组在指向行的指针前加*,就转化为了指向列的指针,反之,在二维数组指向列的指针前加&,就转化为了指向行的指针.(例如:&a[i]或a+i指向行.而a[i]或*(a+i)则指向列)

在定义时的int (*p)[4]的意思是指针变量p指向包含四个整型元素的一维数组,即在二维数组中一共有四行元素

版权声明