指针数组和数组指针

一、指针数组

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值