(20200403)一维数组与指针+二维数组与指针+指针数组+数组指针+二级指针(C语言)

 C语言指针与数组:

1】一维数组与指针

指针遍历一维数组

2】二维数组与指针

指针遍历二维数组

3】指针数组

拉链结构

4】数组指针(用于函数参数)

指针遍历一维数组,二维数组

一维数组,二维数组作为函数参数

5】二级指针

 

1】一维数组与指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	//一维数组与指针
	int a[5] = { 1, 2, 3, 4, 5 };
	int *p = a;

	int *p1 = &a[0];

	int *p2;
	p2 = a;//p2和p等价,这样赋值也是可以的

	int(*p3)[5] = &a;//一维数组指针

	//通过指针访问一维数组
	//a+n=p+n是地址;
	//*(a+n)=*(p+n)=a[n]=p[n], 指针的下标运算:p1=a,可以直接替换
	printf("a[1]=%d\n", a[1]);
	printf("a[1]=%d\n", p[1]);
	printf("a[1]=%d\n", *(a + 1));
	printf("a[1]=%d\n", *(p + 1));

	//遍历一维数组
	for (int i = 0; i < 5; i++)
	{
		printf("a[%d]=%d ", i, a[i]);
		printf("a[%d]=%d ", i, p[i]);//指针遍历数组
		printf("a[%d]=%d \n", i, (*p3)[i]);//数组指针遍历数组

	}



	system("pause");
	return 0;
}

说明:

1)

1)

2)指针下标运算:

int a[5];

int *p;

p=a;

则有公式:*(a+n)=*(p+n)=a[n]=p[n]

3)

4)

 

2】二维数组与指针

 

说明:

上代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	//二维数组与指针
	int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

	//
	int (*p)[2][3] = &a;  //p是二维数组指针,p==&a,(*p)==a
	int(*p1)[][3] = &a;  //p1是二维数组指针,p1==&a,(*p1)==a


	//a+n=p+n是地址;
	//*(a+n)=*(p+n)=a[n]=p[n], 指针的下标运算:p1=a,可以直接替换
	printf("a[1][1]=%d\n", a[1][1]);
	printf("a[1][1]=%d\n", (*p)[1][1]);
	printf("a[1][1]=%d\n", (*p1)[1][1]);

	//通过指针遍历二维数组
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("a[%d][%d]=%d ", i, j, a[i][j]);
			printf("a[%d][%d]=%d\n", i, j, (*p)[i][j]);
		}
	}

	system("pause");
	return 0;
}

说明:

 

 

3】指针数组:(拉链结构)

指针数组,本质是数组,数组的每个元素装的是地址;

用个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	int b[3] = { 1, 3, 5 };
	int c[4] = { 2, 6, 3, 1 };
	int d[2] = { 3, 8 };

	int* a[3] = { b,c,d };//a是指针数组,每个元素装的地址
	int * a1[3] = { &b[0], &c[0], &d[0] };//a1与a等价

	//通过数组指针来访问数组b,c,d
	//打印c[2]=3
	printf("c[2]=%d\n", a[1][2]);



	system("pause");
	return 0;
}

说明:

1)拉链结构

2)

 

补充:

1)这就是个字符串数组,本质是指针数组

2)这里定义的是一个字符串,用一个字符型指针装他的首地址

3)这是个字符数组,其实就是C语言方式定义的字符串

4)这里看做二维字符串数组

 

 

再举个例子:

 

 

4】数组指针:(作用主要用于函数参数)

数组指针,本质是指针,该指针指向一个数组的地址;

1)数组指针遍历一维数组,遍历二维数组,参考上面【1】【2】的内容

略;

2)一维数组,二维数组作为函数参数,即数组指针作为函数参数(重点):

参考:https://blog.csdn.net/sinat_32602421/article/details/105273095

 

一维数组作为函数参数:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//一维数组作函数参数,下面三种方式作用相同
//void fun1(int a[10], int nLength) //一维数组名作函数参数,实际是指针作为参数
//void fun1(int a[],int nLength) //可变长度数组做参数,实际是指针作为参数
void fun1(int *a, int nLength) //指针作为参数
{
//打印数组
int i;
for (i = 0; i < nLength; i++)
{
printf("a[%d]=%d\n", i, a[i]);
}
}
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
fun1(a, 5);//a是数组名,即指针
system("pause");
return 0;
}

 

2)二维数组作为函数参数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二维数组作函数参数
void fun1(int a[2][3], int row,int col) //a是二维数组名,本质是指针作为参数
//void fun1(int a[][3], int row,int col) //2可以省,但是3不能省
{
//打印二维数组
int i,j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("a[%d][%d]=%2d\n",i,j, a[i][j]);
}
}
printf("\n");
}
void fun2(int *p, int row, int col)//p是指针,作为参数
{
//打印二维数组,连续打印
int i;
for (i = 0; i < row*col; i++)
{
printf("%2d", p[i]);
}
printf("\n");
}
void fun3(int(*p)[2][3], int row, int col)//p是指向二维数组的数组指针
//void fun3(int(*p)[][3], int row, int col)//2可以省,但是3不能省
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%2d", (*p)[i][j]);
}
}
printf("\n");
}
void fun4(int (*p)[3],int row,int col)
{
//打印二维数组,连续打印
int i;
for (i = 0; i < row*col; i++)
{
printf("%2d", (*p)[i]);
}
printf("\n");
}
int main(void)
{
int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
printf("fun1=>\n");
fun1(a, 2,3);//a是数组名,即指针
fun1(a[0], 2, 3);
fun1(&a[0], 2, 3);
fun1(&a[0][0], 2, 3);
printf("fun2=>\n");
fun2(a, 2, 3);
fun2(a[0], 2, 3);
fun2(&a[0], 2, 3);
fun2(&a[0][0], 2, 3);
printf("fun3=>\n");
fun3(a, 2, 3);
fun3(a[0], 2, 3);
fun3(&a[0], 2, 3);
fun3(&a[0][0], 2, 3);
printf("fun4=>\n");
fun4(a, 2, 3);
fun4(a[0], 2, 3);
fun4(&a[0], 2, 3);
fun4(&a[0][0], 2, 3);
system("pause");
return 0;
}

 

 

二维数组指针做参数再加一个例子:

 

5】二级指针

二级指针:指向指针的指针;

 

 

int  a;

int *p=&a;

int **p=&p;

 

或:

int a[5];

int *p1=a; //普通指针:p1=a;a[1]==p1[1]

int **p2=&a;//二级指针:p2=&a;  (*p2)==a;a[1]==(*p2)[1]

 

ex1:

 

ex2

 

ex3:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	int b[3] = { 1, 3, 5 };
	int c[4] = { 2, 6, 3, 1 };
	int d[2] = { 3, 8 };

	int* a[3] = { b,c,d };//a是指针数组,每个元素装的地址
	int * a1[3] = { &b[0], &c[0], &d[0] };//a1与a等价
	int **p = a1;//p=a1;

	//通过数组指针来访问数组b,c,d
	//打印c[2]=3
	printf("c[2]=%d\n", a[1][2]);
	printf("c[2]=%d\n", p[1][2]);



	system("pause");
	return 0;
}

说明:

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值