/*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");
}
}