C语言指针与数组

发布于:2022-11-05 ⋅ 阅读:(498) ⋅ 点赞:(0)

目录

一、数组的指针

二、指针数组

1.指针数组的定义

2.指针数组的引用

三、数组指针

1.数组指针的定义

2.数组指针的引用


一、数组的指针

        在c语言中,数组的指针就是数组的首元素在内存中的地址,也就是数组在内存中的起始地址,如下代码:

#include<stdio.h>
main()
{
	int arr[1];
	scanf("%d",arr);
	printf("arr[0]=%d",arr[0]);
 } 

运行结果: 

 2

arr[0]=2

         在scanf语句中,在arr之前并没有添加&取地址符,但仍然接收了2,由此可得,数组名也是一个地址,它即为数组的起始地址。

        如果将数组的起始地址赋给某个指针变量,那么这个指针变量就是指向数组的指针变量,其定义方式为:

int a[10],*p=a(或*p=a[0]);

        在运用的时候可以将指针当做数组名。 

        当需要用指针操作整个数组的时候,可以用p+i和a+i来表示数组元素a[i]的地址,因此*(p+i)和    *(a+i)就是数组元素a[i],同时可以将指针变量p看做数组名,两者可以互相转化,p[i]等价于*(p+i)等价于a[i]。例如:

#include<stdio.h>
main()
{
	int a[5],*p,i;
	p=a;    //将数组a[5]的起始地址赋给指针变量p
	for(i=0;i<5;i++)
	scanf("%d",p+i);//等价于scanf("%d",a[i])
	for(i=0;i<5;i++)
	printf("%d ",p[i]);//等价于printf("%d ",a[i])
}

        输出结果为:

1 2 3 4 5

1 2 3 4 5 

        也可以使用以下方式来表达:

 

#include<stdio.h>
main()
{
	int a[5],*p,i;
	p=a;    
	for(i=0;i<5;i++)
	scanf("%d",p+i);
	for(;p<a+5;p++)
	printf("%d ",*p);
}

输出结果为:

1 2 3 4 5

1 2 3 4 5 

二、指针数组

1.指针数组的定义

        当整个数组中的每一个元素都是一个指针变量的时候,这个数组就被称为指针数组,其定义格式为:

数据类型符  *变量名[常量表达式];

2.指针数组的引用

#include<stdio.h>
main()
{
	int a[5]={6,7,8,9,0},i;
	int *p[5];
	for(i=0;i<5;i++)
	{
	p[i]=&a[i];
	printf("%d ",*p[i]);
	}
	
}

输出结果为:

6 7 8 9 0 

        如上,定义一个指针数组*p[5],并且将这个指针数组的每个单元指向了数组a[5] 的各个单元,这个指针数组中存放着对应数组a[5]中每一个元素的首地址。

三、数组指针

1.数组指针的定义

        数组指针值的是一个指针指向一个一维数组,存放了这整个数组的地址,其定义方式为:

数据类型符   (*数组名)[常量表达式];

2.数组指针的引用

        在二维指针中,其数据单元在内存单元中是按行排列的即先存放第一行的数据元素,以此类推,定义一个二维数组a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},我们可以将其看成如下排列方式:

a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]

        该二维数组可以看成是由三个元素a[0],a[1],a[2]组成的一维数组,a是该一维数组的数组名,即该一维数组的首地址,即第一个元素a[0]的地址,我们已知,a+1表示的就是首地址之后的第一个元素的首地址即a[1]的地址,因此,通过这些地址就可以引用各个元素的值,如*(a+1)就是元素a[1],*(a+2)就是元素a[2]。

        在此基础上,可以将a[0],a[1],a[2]这三个元素看成由四个元素组成的一维数组的数组名,如,a[0]可以看成由a[0][0],a[0][1],a[0][2],a[0][3]组成的一维数组,与上面类似,a[0]是该一维数组的数组名,即该一维数组的首地址,即第一个元素a[0][0]的地址,则,a[0]+1表示的就是首地址之后的第一个元素的首地址即a[0][1]的地址,因此*(a[0]+1)就是元素a[0][1],*(a[2]+3)就是元素a[2][3].

        如下引用:

#include<stdio.h>
main()
{
	int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},i,j;
	int *p;
	p=&a[0][0];
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%d\t",*(a[i]+j));
		}
		printf("\n");
	}	
}

输出结果为:

1        2        3        4

5        6        7        8

9        10      11     12 

        

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到