二维数组与指针

/*void指针高级
通用性指针 可以指向任何类型的数据
void *p;

#include <stdio.h>

int main()
{
int a=1;
char c=‘A’;
void *p;

p=&a;
printf("%p",p);
int pa=(int)p;//强制类型转换
printf("%d",*pa);
return 0;

}

void * memcpy(void* addr,void addr1,size_t n);
特定的内存单元读写
利用数据指针可直接通过内存地址操作特定的内存
unsigned int p=(unsigned int)0xF000FF00;

//指针与二维数组

int a[3][3]
a[1][2]的地址为a[1]+2;(a+1)+2,&a[1][2];
a[1][2]的值为 (a[1]+2),(
(a+1)+2),a[1][2];
列地址

*(行地址)拿到的是列的地址
*(a+1)是第二行第一列的地址

#include <stdio.h>

int main()
{
int a[3][3]={}
a 和 &a[0]是第一行地址
*a 和 a[0] 是第一行第一列的地址

}

列指针 遍历
#include<stdio.h>
void out1(int a[][4],int size);
void out2(int *p , int size);
void out3(int (*p)[4],int row,int col );

int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
out1(a,12);//实参和形参都是数组名
printf("\n*****************\n");
out2(a,12); //实参和形参都是指针
printf("\n
****************\n");
int (*p)[4];
p=a;
out3(p,3,4);
out3(a,3,4);
}
void out1(int a[][4],int size)
{
int *p;//列指针
for(p=a[0];p<a[0]+12;p++)
{ if((p-a[0])%4==0)
printf("\n");
printf("%d",*p);

 }

}

void out2 (int *p,int size)
{
int *s;
for(s=p;s<p+size;s++)
{ if((s-p)%4==0)
printf("\n");
printf("%d ",*s);

 }

}

void out3(int(p)[4],int row,int col)
{
int i,j;
for (i=0;i<rom;i++)
for(j=0;j<col;j++)
{
printf("%d",
(*(p+i)+j));

	   }

}

//行指针
//类型说明符 (*指针变量名)【n】

#include<stdio.h>
#include<string.h>
void out_student(char(p)[20],int n);//行指针 指针数组
//sort_student(student,int n);
int main()
{
char students[3][20];
int i;
for(i=0;i<3;i++)
{
scanf("%s",
(students+i)); //找到第i行第一列的地址

}
out_student(students,3);

sort_student(students,3);//
out_student(students,3);//students是一个字符数组

}

void out_student(char(p)[20],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s",
(p+i)); //p是行指针,获得第i行的第一列的地址

}

//char *strcpy(char dest ,const charsrc) 第一个参数是字符数组的名字 第二参数是常量指针 原内容不可以修改 字符串 一维字符数组的名字 返回的是目标的指针
}
void sort_student(char(p)[20],int n)//char(p)[20]字符数组
{
int i,j;
for (i=0;i<n-1;i++)
int pos=i;
for(j=i+1;j<n;j++)
{
if(strcmp(
(p+j),
(p+pos))<0//参数必须是列地址 一维数组的首地址
pos=j;

}
if(pos!=i){
	char str[20];
	strcpy(str,*(p+pos));
	strcpy(*(p+pos),*(p+i));//p+i行地址*(p+i)是列地址 
	strcpy(*(p+i),str);
	
	
	
}

}

//指针数组
//统计学生平均成绩和查找某名学生的成绩
//行指针找的是某一行

#include<stdio.h>
#define Row 2
#define Col 2
void ave(int *p,int n); //列指针
void search(int (*p)[Col],int n);//数组指针 行指针
int main()
{
int score[Row][Col];
for(int i=0;i<Row;i++)
{printf(“intput %d student”,i+1);
for(int j=0;j<Col;j++)
{

		scanf("%d",&score[i][j]);
		
	}
}
ave(*score,Row*Col);//参数是列地址  score是行地址 要加*
int bh;
printf("please input bh:");
scanf("%d",&bh);
if(bh<=0||bh>Row){
	printf("bh error");
		return 1;

				}
search(score,bh-1);

return 0;
}
void ave(int *p,int n)
{
int *s;
int sum=0;
int aver=0;
for(s=p;s<p+n;s++)
{
sum+=*s;

}
aver=sum/n;

printf("average :%d\n",aver);

}

void search(int (p)[Col],int n)
{
int i;
for(i=0;i<Col;i++)
{
printf("%d",
((p+n)+i));//(p+n)是行指针

}
printf("\n");

}

//根据姓名查找个人信息
//《addrlist.h》
#include<stdio.h>
#include<string.h>
#define NAME_LENGTH 30
#define ADDR_LENGTH 100
#define PHONE_LENGTH 4
#define MAX_ADDRESSES 1000

extern char const *look_address(char const *name );//形参 常量指针 返回的也是常量指真
extern char const *look_phone(char const *name);//指针函数 外部函数

//函数定义
//<addrlist.c>
//#include <stdio.h>

//静态数组 仅限当前文件
static char name[MAX_ADDRESSES][NAME_LENGTH]={“jack”,“tom”,“marray”};
static char phone[MAX_ADDRESSES][NAME_LENGTH]={“139”,“137”,“138”};
static char address[MAX_ADDRESSES][NAME_LENGTH]={“shanghai”,“beijing”,“suzhou”};
static int find_index(char const *find_to_mane);

//根据名字查找下标
static int find_index(char const find_to_name)
{
int index;
for(index=0;index<MAX_ADDRESSES;index++)
{
if(strcmp(find_to_name,
(name+index))==0)
return index;
}

return -1;

}
char const *look_phone(char const *name)
{
int index=find_index(name);
if(index==-1)
return NULL;
else
return *(phone+index);

}
char const *look_address(char const *name)
{
int index=find_index(name);
if(index==-1)
return NULL;
else
return *(address+index);

}

//调用程序

int main(void)
{
char name[20]={’\0’};
printf(“iuput your name:”);
scanf("%s",name);
char const*phone= look_phone(name); //指向的一维数组的
char const *address=look_address(name);
if(*phone!= NULL&& * address !=NULL)
{
printf("%s\n",phone); //返回的常量指针 指向的是电话号码和地址信息
printf("%s\n",address);//传入的是首地址即可

}
else {
	
	printf("error");
}

return 0;

}

//指针数组:元素值是指针
类型说明符*数组名[数组长度]
int *p[3] 有三个指针向int 的指针

#include<stdio.h>

void out_num(int *nums[],int n) //数组指针有括号int(*p)[3]
{
int i;
for(i=0;i<n;i++)
{
printf("%d",*nums[i]);

}

}
//指针数组就是指针的数组,元素是指针。数组指针是一个行指针指向包含n个元素的一维数组
int main()
{
int num[]={1,2,3,4,5};
int *nums[5]={&num[0],&num[1],&num[2],&num[3],&num[4]};
out_num(nums,5);

}

字符指针数组
char *names[]={“zhangsan”,“lisi”,“wangwu”};//不是一维数组 而是字符数组的首地址
//字符存储在常量区 names存储在栈区
char name[][]={“zhangsan”,“lisi”,“wangwu”};//二维数组存储字符形式字符是一维数组
//字符全部存储在栈区

#include<stdio.h>
void out_str(char *names[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s %p\n",names[i],names[i]);

}

}
void out_name(char **pp,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s",*(pp+i));//(pp+i)是某个元素的地址

}

}
int main(void)
{
char *names[]={“zhangsan”,“lisi”,“wangwu”};//
//printf(“name[0:]%sname[0]%p”,*names,names[0]);
//char names[3][8]={“zhangsan”,“lisi”,“wangwu”};
//names[0][0]=‘Z’;
//printf(“name[0]%cname[0]%p”,names[0][0],names[0]);
out_str(names,3);
out_name(names,3);
return 0;
}

//排序

#include<stdio.h>
#include<string.h>
void out_str(char *names[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s %p\n",names[i],names[i]);

}

}
void out_name(char **pp,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%s",*(pp+i));//(pp+i)是某个元素的地址

}

}
void sort(char *names[],int n)
{
int i,j;
for(i=0;i<n-1;i++)
{ int pos=i;
for(j=i+1;j<n;j++)
{
if(strcmp(names[j],names[pos])<0) //首地址
pos=j;

	}
	
	if(pos!=i)
	{
		char *temp;
		temp=names[pos];
		names[pos]=names[i];
		names[i]=temp;
		
	}
}

}
void sort1(char **pp,int n)
{
int i,j;
for(i=0;i<n-1;i++)
{ int pos=i;
for(j=i+i;j<n;j++)
{
if(strcmp((pp+j),(pp+pos))<0) //首地址
pos=j;

	}
	
	if(pos!=i)
	{
		char *temp;
		temp=*(pp+pos);
		*(pp+pos)=*(pp+i);
		*(pp+i)=temp;
		
	}
}

}

int main(void)
{
char *names[]={“zhangsan”,“lisi”,“wangwu”};//

out_str(names,3);

// sort(names,3);
sort1(names,3);
out_name(names,3);
return 0;
}

内核-》例程(在库文件中)调用主函数
收集命令行参数
int main(int agc,char *argv);
int agc 命令行参数 ->bin/sort 路径 (1,2,3,4,5)
char *argv -> 参数内容
*/
#include<stdio.h>
int main(int argc,char *argv[])
{
printf(“argc:%d\n”,argc);
int i;
for(int i=0;i<argc;i++)
{
printf("%s",argv[i]);
printf("\n");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值