一(二)维指针数组

重点:
定义变量:按类型分配空间
    类型 变量名;
    类型 数组名;
初始化:
引用变量:引用内容
       1.自身内容:  变量名;  *地址
       a
       数组名[下标]

1、指针与变量的关系:
       1.见源代码
2、指针与数组的关系:
  2.1指针与一维普通数组
  2.2指针数组:专门用于存放指针的数组
        类型* 数组名[长度]    eg:  int* buf[10]
        引用元素:数组名[下标法]
  2.3指针与二维数组: int buf[10]   int buf1[3][4]
       一维数组名:指向是该行第一列
            buf+0第一列   buf+1第二列
       二维数组名:指向是某一行的地址
            1、buf1+0第一行  buf1+1 第二行        buf1行地址
            2、由于buf1[0] buf1[1] buf1[2]三个一维数组成的一个int buf1[3][10]的二维数组
               所所以buf1[0]等价一维数组的名字(列)
                 buf1[0]+0第一行的第一列  buf1[0]+1第一行的 第二列的地址

3、引用内容:必须确定到行和列
                buf1[2][2],*(buf1[2]+2),*(*(buf1+2)+2),(*(buf1+2))[2]

二维指针变量:   类型 (*指针变量)[列]
   2.4指针与结构体变量的关系:
      结构体:自定义类型
      结构体变量:分配空间按类型分配    
      2.4.1定义结构体指针变量: struct 类型*  变量名
      2.4.2引用成员:
            变量.成员;
            指针->成员;
            (*指针).成员;
            注:指针变量必须指向一个元素
优先级:       
          . >  *  > 运算符  > 逻辑运算符 >  赋值        
      2.4.3结构体指针数组:
            类型* 数组名[长度]; 
                struct people* buf[10];

        指针与数组的关系 :

#include<stdio.h>

void main()
{
/*
//定义变量:根据类型分配空间   类型 变量名;
	int a=100;
	printf("%x\n",&a);
//指针变量:存储指针的变量 类型* 变量名;
	int* pa=&a;
//引用变量:引用变量的内容
	printf("%d  %x\n",a,pa);
	printf("%d\n",*pa);
*/
//指针与数组的关系 :
//定义数组:类型 数组名[长度];
 //定义整型数组:
// 	int buf[10]={1,2,3,4,5,6,7,8,9,10};	//整型数组:专门存放整型的值
//引用数组:下标法 指针法
//	printf("%d %d\n",buf[2],*(buf+2));	//指针法: 指针+2 向高位移动2个元素,指向第3个元素的地址
//指针数组:专门存入指针的数组
	int a=100,b=200,c=300,d=400,e=500;//分配空间:地址
	int* buf[]={&a,&b,&c,&d,&e,NULL};	
	printf("%d\n",sizeof(buf));		
//引用数组:下标法  名[下标]
	printf("&b=%x buf[1]=%x %d\n",&b,buf[1],*buf[1]);
/*	
	int i=0;
	for(i=0;i<5;i++)
	{
		printf("%d\n",*buf[i]);
	}
*/
	int i=0;
	int listen=**(buf+0);
	for(i=1;buf[i]!=NULL;i++)
	{
		if(listen< **(buf+i))
			listen=**(buf+i);
	}
	printf("%d\n",listen);
//通过buf查找指向最大值
}

        二维数组与指针的关系 :

#include<stdio.h>
//二维数组与指针的关系 
void main()
{
//定义一维数组:类型 数组名[长度];
	int buf[10]={1,2,34,5,6,7,8,9,10};	//分配空间
	printf("%x %x\n",buf,&buf[0]);//数组名:首地址
	printf("%x %x\n",buf,buf+1);
//引用内容:下标法  指针法
	printf("%d %d\n",buf[2],*(buf+2));//buf[2]==*(buf+2)

//定义二维数组:分配空间
	int buf1[3][10]={{0,1,2,3,4,5,6,7,8,9},
			 {10,11,12,13,14,15,16,17,18,19},
			 {20,21,22,23,24,25,26,27,28,29}};

//数组名:首地址:  
	printf("%x %x\n",buf1,&buf1[0][0]);
	printf("%x %x\n",buf1,buf1+1);//buf某一行  行
	printf("%x %x %x\n",buf1[0],*(buf1+0),*(buf1+0)+1);//buf[0]第一行的第一列 列
//引用元素的内容:第三行 第三列
	printf("%d %d %d %d\n",buf1[2][2],*(buf1[2]+2),*(*(buf1+2)+2),(*(buf1+2))[2]);
}

         指针与结构体的关系 :

#include<stdio.h>
//学生(id,姓名,成绩)
struct student
{
//属性:声明属性
	int id;	
	char name[10];
	float score;
};

void main()
{
/*
//定义结构体变量:分配空间
	struct student lm={1001,"lm",99};
	printf("%d\n",sizeof(lm));
	
//输出地址
	printf("%x\n",&lm);
//定义结构体指针变量:专门存放指针的变量
	struct student* ps=&lm;	

//引用成员:
	printf("%s %d\n",lm.name,lm.id);
	printf("%s %s\n",ps->name,(*ps).name);	//.  > *


//定义指针变量:
	struct student* ps1=NULL;
	if(NULL!=ps1)
		printf("%s\n",ps1->name,(*ps).name);
*/
/*
//结构体变量:按类型分配
	struct student lm={1001,"lm",99};
	struct student zhl={1002,"zhl",100};
	struct student hxs={1003,"hxs",59};
	
//结构体的指针数组:
	struct student* pe[4]={&lm,&zhl,&hxs};
	printf("%d\n",sizeof(pe));
//引用
	int i=0;
	for(i=0;pe[i]!=NULL;i++)
		printf("%s %d %f\n",pe[i]->name,(*(pe+i))->id,(*pe[i]).score); // 变量.成员
*/
//二维数组:由多个一维数组成的二维数组
	struct student  s[3][2]={{{1001,"lm",99},{1002,"zyf",100}},\
				 {{2001,"zs",89},{2002,"ls",59}},\
				 {{3001,"wh",67},{3002,"zl",65}}
				};
	
	printf("%x,%x\n",s,s+1);//s行指针 s第一行  s+1第二行
	printf("%x,%x\n",s[0],s[0]+1);//列指针
	printf("%x\n",*(s+0));	//下标法与指针互换
//引用内容:
	printf("%s\n",(*(*(s+2)+1)).name);
}

          定义二维指针变量 , 引用二维数组元素 .

#include<stdio.h>

void main()
{
//定义二维数组:
	int buf[3][4]={{1,2,3,4},{21,22,23,24},{31,32,33,34}};
//引用:数组名就是首地址(buf行指针  )
	//printf("%x %x\n",buf+1,buf);	//行指针+1 指向下一行  16Byte
//二维指针变量:	
	int (*pbuf)[4]=buf;	//(笔试中)
	int* pline=buf[0];

	int i=0;
	for(i=0;i<12;i++)
	{
		printf("%d\n",*(pline+i));
	}

	printf("%d %d\n",pbuf,pbuf+1);	//行指针
	printf("%d %d %d %d\n",pbuf[0],pbuf[0]+1,pbuf[1],pbuf[1]+1);		//列指针
//引用元素
	printf("%d %d\n",buf[1][1],pbuf[1][1]  );
	printf("%d %d\n",*(buf[1]+1),*(pbuf[1]+1)  );
	printf("%d %d\n",*(*(buf+1)+1),*(*(pbuf+1)+1)  );
	printf("%d %d\n",(*(buf+1))[1],(*(pbuf+1))[1]  );
/*
//求每一列的平均值  [行][0]
	int i=0,j,sum=0;
	for(j=0;j<4;j++)//列
	{
		sum=0;
		for(i=0;i<3;i++)//行
		{
			sum += *(*(pbuf+i)+j);
		}
		printf("ave=%d\n",sum/3);
	}
*/
}

猜你喜欢

转载自blog.csdn.net/Superman___007/article/details/81194814