目录
二维数组:
本质:是一维数组的一维数组。
数组本身的特点:
①连续性(连续存储)②有序性 ③单一性(存储10同一种类型的数据)
指针到二维数组:
①应该定义什么类型的指针?
int a[10][10];
二维数组名a的含义:
1.代表数组首元素的地址&a[0];
2.代表二维数组的类型:(去掉名字即为类型)int[][]
存放的数据类型int[],即存放一维数组;
用什么类型的指针指向二维数组?
int a;int *p = &a;(p的类型为int*类型,它指向的内存空间(存放的地址)所存储的数据类型为int型)
推导一维数组:int a[10];一维数组内存空间存储的数据类型为(a[0])为int型,所以需要一个
int *型指针指向一维数组:int* p = a(即*a[0]),
推导二维数组:int a[2][2] ,存放的数据类型为int[2]一维数组类型,
所以需要int[2] * 型的指针指向二维数组,即int[2]* p,但编译器不支持这种写法,
应写为int (*p)[2];这种指向数组的指针称为数组指针
int (*p)[2] = a(等价&a[0]),a为二维数组名,也为二维数组首元素的地址(&a[0]),
p所指向内存空间存放的数据类型为int[]一维数组,所以对p进行加减操作时,中间的差值为一个一维数组的大小,p指向a[0],那么p+1就指向了a[1];a[0]里面存放了2个int型的数据。
访问数组元素:
1.从数组的本质出发,逐层访问,int a[i][j];第一层(p+i)代表第i个元素的地址,*(p+i)得到int[j]这种类型的地址*(p+0)即&a[0][0]的地址,在这个地址的基础上进行加加即(*(p+0))+1,即得到&a[0][1]的地址,简写为*(p+0)+1;要想访问到地址里面的值要在进行一次解引用即*(*(p+i)+j)等价于a[i][j]得到二维数组里面的值。
二维数组求对角线最大值与副对角线最小值
#include <stdio.h>
int nnMax(int (*a)[3],int row)
{
int (*p)[3] = a;
int i = 0;
int j = 0;
int max = **p;
for(i = 1; i < row; i++)
{
for (j = 0; j < 3; j++)
{
if(i == j && *(*(p+i)+j) > max)
{
max = *(*(p+i)+j);
}
}
}
return max;
}
int nnmin(int (*a)[3],int row)
{
int (*p)[3] = a;
int i = 0;
int j = 0;
int min = *(*p+2);
for (i = 0; i < row;i++)
{
for(j = 0; j < 3; j++)
{
if(j+i == 2 && *(*(p+i)+j)< min)
{
min = *(*(p+i)+j);
}
}
}
return min;
}
void printArray(int (*a)[3],int row)
{
int (*p)[3] = a;
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d",*(*(p+i)+j));
}
putchar('\n');
}
}
int main()
{
int a[3][3] = {3,5,2,6,1,7,9,8,4};
printArray(a,3);
printf("min = %d\n",nnmin(a,3));
printf("max = %d\n",nnMax(a,3));
return 0;
}
指针实现字符串倒置
#include <stdio.h>
#include <string.h>
void reverse(char *begin,char *end)//实现数组倒置
{
while(begin < end)
{
int temp = *begin;
*begin = *end;
*end = temp;
begin++;
end--;
}
}
void wordReverse(char *s)
{
reverse(s,s+strlen(s)-1);
char *p = s;
char *q = NULL;
while(*s != '\0')
{
q = p;
while(*q != ' ' && *q != '\0')
q++;
reverse(p,q-1);
if(*q == '\0')
break;
q++;
p = q;
}
}
void Puts(char *s)
{
while(*s != '\0')
{
putchar(*s);//结果输出you are how
s++;
}
putchar('\n');
}
int main()
{
char s[30] = "how are you";
char len = strlen(s);
wordReverse(s);
Puts(s);
return 0;
}
指针实现字符串转变为整数:
#include <stdio.h>
int change(char *s)
{
int n = 0;
int m = 0;
while(*s != '\0')
{
m = *s -'0';
n = n * 10 +m;
s++;
}
return n;
}
int main()
{
char *s = "12345";
printf("%d\n",change(s));
return 0;
}
指针实现二维数组字符串逆序
void pointerArrayReverse(char **begin,char **end)
{
while(begin < end)
{
char *temp = *begin;
*begin = *end;
*end = temp;
*begin++;
*end--;
}
}
指针实现字符串比较找最大值:
char *charPointer1(char **p,int len)
{
int i = 0;
char *max= *p;
for (i = 0; i < len ;i++)
{
if(strcmp(*(p+i),max)>0)
{
max = *(p+i);
}
}
return max;
}
指针实现二维数组字符串排序
void pointerArraySort(char **begin,char **end)
{
char **p = begin;
char **q = NULL;
for(p = begin; p < end; p++)
{
for (q = p+1; q <= end; q++)
{
if(strcmp(*p,*q)>0)
{
char *temp = *p;
*p = *q;
*q = temp;
}
}
}
}
指针+函数:
通过指针的方式来调用函数:
函数名即函数的入口地址
int add (int a,int b):
1.函数名对应的数据类型:int(int ,int)
2.回调函数实现两个数加减乘除
3.代表一类函数
4.返回值为int 型//带有两个int型的形参变量
5.函数名即函数的入口地址
#include <stdio.h>
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}
void processData(int a,int b,int (*pfunc)(int,int))
{
printf("%d\n",pfunc(a,b));
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
processData(a,b,div);
return 0;
}
main
include <stdio.h>
int main(int argc,const char *argv[])//argc命令行参数的个数,
//argv:存放命令行参数的字符串的指针数组
{
printf("argc = %d\n",argc);
int i = 0;
for(i = 0; i < argc;i++)
{
printf("argv[%d] = %s\n",i,argv[i]);
}
return 0;
}