一、指针数组
1.概念
指针数组本质上是一个数组,数组里面存放的内容是指针类型;
定义格式: 数据类型 * 标识符[数组的成员个数];
例子: int * arr[5]; // []的优先级 比 *高,所以
arr先和[5]集合,是一个数组,然后数组里面存放的是指向整形的指针。
2.特性
数组每个成员都是一个指针变量;
含义:可以统 一 1个指针数组的变量,控制多个单独的变量。
示例程序:定义一个指针数组并初始化,通过操作数组中的元素来改变其指向的内容的值。
#include<stdio.h>
int main(int argc,char* argv[])
{
//定义5个变量
int num1=1;
int num2=2;
int num3=3;
int num4=4;
int num5=5;
//定义一个指针数组,来存放这个5个变量的地址
int * p[5]= {&num1,&num2,&num3,&num4,&num5};
printf("before alter:\n");
//打印变量的值
for(int ii=0;ii<sizeof(p)/sizeof(int*);ii++)
{
printf("num1=%d,num2=%d,num3=%d,num4=%d,num5=%d.\n",num1,num2,num3,num4,num5);
}
printf("\n");
//通过数组来改变这些变量的值
for(int ii=0;ii<sizeof(p)/sizeof(int*);ii++)
{
*p[ii]+=(ii+1)*10;
}
printf("after alter:\n");
//打印变量的值
for(int ii=0;ii<sizeof(p)/sizeof(int*);ii++)
{
printf("num1=%d,num2=%d,num3=%d,num4=%d,num5=%d.\n",num1,num2,num3,num4,num5);
}
return 0;
}
二、数组指针
1.概念:
数组指针本质是一个指针,这个指针指向一个数组;
数组名 == 数组的首元素地址 ==整个数组的首地址
2.数组指针定义(也称为行指针)
*格式:数据类型 (标识符) [数组元素个数]
示例:
int *arr[5]; //指针数组
int (*p)[5]=&arr; //指向数组的 数组指针
下面通过用数组指针和二维数组来演示数组指针的使用;
#include<stdio.h>
int main(int argc,char* argv[])
{
int arr[3][5]={{1,2,3},{4,5,6},{7,8,9}}; //定义一个3行5列的二维数组
//定义一个数组指针(行指针)
int (*p)[5]=arr; //arr数组名从特性上也类似于数组指针
//打印一下p的值和arr的值
printf("p=%p,arr=%p\n",p,arr);
printf("对p和arr进行加1操作:\n");
//当他们的偏移量为1时,他时增加4个字节还是40个字节呢?
//行指针每次移动1 偏移量= 首地址 + [数组元素个数]*数据类型;
//二者偏移量一致,也就是说明了二维数组的数组名arr实际上也类似于行指针
printf("p+1=%p,arr+1=%p\n",p+1,arr+1);
if(arr+1 == p+1)
{
printf("二维数组的数组名其实也是一个行级指针,但是它和指针是有区别的,数组名是一个地址常量,其地址无法发生改变。\n");
}
else
{
printf("二维数组的数组名不是一个行级指针。\n");
}
//利用行指针来改变数组的值
for(int ii=0;ii<3;ii++)
{
for(int jj=0;jj<3;jj++)
{
*(*(p+ii)+jj)=100+jj;
}
}
//打印数组的值
for(int ii=0;ii<3;ii++)
{
for(int jj=0;jj<3;jj++)
{
printf("p[%d][%d]=%d\n",ii,jj,p[ii][jj]);
}
}
return 0;
}