| 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;
} ![](https://img-blog.csdnimg.cn/20200403210522185.png) 说明: 1) ![](https://img-blog.csdnimg.cn/20200403165921839.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 1) ![](https://img-blog.csdnimg.cn/20200403210510833.png) 2)指针下标运算: int a[5]; int *p; p=a; 则有公式:*(a+n)=*(p+n)=a[n]=p[n] 3) ![](https://img-blog.csdnimg.cn/20200403170430904.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 4) ![](https://img-blog.csdnimg.cn/20200403170659451.png) |
| 2】二维数组与指针 ![](https://img-blog.csdnimg.cn/20200403202451272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20200403203714622.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 说明: ![](https://img-blog.csdnimg.cn/20200403221953234.png) ![](https://img-blog.csdnimg.cn/20200403222007782.png) ![](https://img-blog.csdnimg.cn/20200403222023339.png) ![](https://img-blog.csdnimg.cn/20200403222051201.png) 上代码: #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;
} ![](https://img-blog.csdnimg.cn/20200403205912350.png) 说明: ![](https://img-blog.csdnimg.cn/20200403210025511.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) |
| 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)拉链结构 ![](https://img-blog.csdnimg.cn/20200403213204969.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 2) ![](https://img-blog.csdnimg.cn/20200403213420736.png) 补充: 1)这就是个字符串数组,本质是指针数组 ![](https://img-blog.csdnimg.cn/20200403222359852.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 2)这里定义的是一个字符串,用一个字符型指针装他的首地址 ![](https://img-blog.csdnimg.cn/20200403222600745.png) 3)这是个字符数组,其实就是C语言方式定义的字符串 ![](https://img-blog.csdnimg.cn/20200403222710600.png) 4)这里看做二维字符串数组 ![](https://img-blog.csdnimg.cn/20200403222753670.png) 再举个例子: ![](https://img-blog.csdnimg.cn/20200403230037276.png) ![](https://img-blog.csdnimg.cn/20200403230000621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20200403230115570.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) |
| 4】数组指针:(作用主要用于函数参数) 数组指针,本质是指针,该指针指向一个数组的地址; ![](https://img-blog.csdnimg.cn/20200403212024331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 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;
} ![](https://img-blog.csdnimg.cn/20200403211559266.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 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;
} ![](https://img-blog.csdnimg.cn/20200403211650369.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) 二维数组指针做参数再加一个例子: ![](https://img-blog.csdnimg.cn/20200403230311315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) |
| 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: ![](https://img-blog.csdnimg.cn/20200403223308419.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20200403223445315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) ex2 ![](https://img-blog.csdnimg.cn/20200403223906820.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20200403223921602.png) 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;
} ![](https://img-blog.csdnimg.cn/20200403225700354.png) 说明: ![](https://img-blog.csdnimg.cn/20200403225631720.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzMyNjAyNDIx,size_16,color_FFFFFF,t_70) |