C语言 一维数组与指针

一、一维数组原理

C语言中 指针pointer 同义词 地址address

1.数组名的真正作用:数组整个存储空间的首地址(最小最前面的地址),也代表第0个元素的地址

    int as[]={10,20,30,40,50};
	printf("%d %d\n", as + 0, as + 1);
	printf("%p %p\n", as, as + 1);//地址的方式用p 也就是16进制

    int* p = as[0];

因为p为指针变量,所以可以进行赋值类(++、+= .....)运算,但数组名不可以进行此类赋值运算,因为数组名属于是指针常量,是不可被修改的。

2.数组名+偏移量操作成员空间

其实指针操作就是一个找到与得到的过程

as + 1      //找到 新地址
*(as+1)    //得到 空间使用权

	*(as + 1) = 5;//空间的寻找过程
	*(as + 1) += 10;
	as[1] = 5;//空间寻找的 快捷方式
	as[1] += 5;

3.深度理解[] 作为运算符的作用:就是指针移动

在C语言中,[]是个运算符:  公式: 参考地址[偏移] == *(参考地址+偏移)

	printf("%d %d\n", as[2], 3[as]);// *(3+as)
	printf("%d \n", (as + 3)[-1]);//分析结果的要领:把[]拆成 过程

只要是遇到[],就可以将它拆成*(+)的形式。

as与&as的区别

	printf("%d %d\n", as,as+1);
	printf("%d %d\n", &as,&as+1);

 数组名+1是数组内成员移动,&数组名 得到整个数组的 首地址 &数组名+1 得到数组后面空间的首地址。

二、指针与一维数组某元素

1.int型指针 指向int型数组 的意义

	int as[]={10,20,30,40,50};
	int *p;
	p = as;

这里的as其实是数组中第零个元素,正常要写成&as[0],但是&as[0]拆: &  *(as+0) ==> (as+0) ==> as

2.比较 指针+1与数组名+1的区别

	printf("%d %d\n", as + 1, p + 1);

 答案是没有区别,因为指向的都是数组内的下一个元素。

3.深度理解:数组名+[下标] 与 *(指针+移动) 与 指针+[下标] 的应用效果

	for (int i=0;i<5;i++)
	{
		printf("%d %d %d %d\n", as[i], *(as + i), *(p + i), p[i]);
	}

 他们实际上也是==关系

4.利用指针变量实现数组的变量操作

	for (int i = 0; i < 5; i++)
	{
		printf("%d \n", *p);
		p++;//指针变量 遍历数组:指针最终指向了哪里
	}

这里的++也可以直接写在*p后边,因为*的优先级与++相同,并且计算的过程是从右向左算,恰好p++是先将值给出去再进行++操作的,所以两种写法的计算过程相同。

 三、指针数组(指针类型的数组)

指针类型的数组简称:指针数组。 每个数组成员都是指针变量。

#include 
int main()
{
	int a=1,b=2,c=3,d=4,i;
	int arr[5] = { 1,3,5,7,9 };
	// 指针类型的数组简称:指针数组。 每个数组成员都是指针变量。
	int* p[4] = {&a,arr,arr+1,&arr[4]};

	for (i=0;i<4;i++)
	{
		printf("%d %d\n", *p[i],**(p+i));
	}
	 
	return 0;
}

在指针数组中,每个成员都是一个指针变量,它可以对同类型的数据进行存储,在获得真正数据时就是要对此成员进行*操作,例如*p[1],对其进行进一步分析就会变为**(p+1),看起来就像二级指针一样。

C语言 一维数组与指针_第1张图片

 四、数组指针(指向数组的指针)

数组·指针 == 可以指向管理 一组数的空间 的指针

int [4]       //4个int  把int[4]  当作一个类型看

    int(*pint4)[4];

这个就是数组指针,是扩展的指针类型。

如果去掉括号变为int* pint4[4],那么就会变为指针数组,因为计算机会认为int与*先结合,然后扩展出4个同类型。

	int a[] = {1,2,3,4};
	pint4 = &a;

这里要写成&a,因为pint4要指向的是a这个数组,虽然a 和&a 计算的地址号相同,但意义不同 &a是对整个数组取地址 a是对数组第0个元素取地址。

利用 数组指针 遍历数组

先来看一下数组指针空间的大小与得到空间的大小

	printf("%d %d\n", sizeof(pint4), sizeof(*pint4));

 数组指针的空间大小还是为4 ,因为指针的空间大小只与操作系统的位数有关。

	for (int i=0;i<4;i++)
	{
		//(*pint4)得到4个int空间,[i]得到其中第i个空间
		printf("%d %d %d\n", (*pint4)[i], *pint4[i],*((*pint4)+i));//找到 得到
	}

 在三组计算结果中,只有第二组是有问题的。第三组就是第一组的打开。那么第二组的问题出在哪里呢,如果不对*pint4加括号,打开后就会变成**(pint4+i),那么pint4指向的将不再是目标数组,所以无论怎么进行*操作都不会得到真正的数据。

这里我认为只要时刻记得  *数组指针==数组名 就会避免很多错误。

你可能感兴趣的:(C语言技术体系,c语言,开发语言)