目录
1.数组和指针的关系:
1.一维数组和指针的关系:
2.一维数组传参:
3.一维字符型数组传参:
4.字符串传参:
练习1:
练习2:
练习3:
练习4:
2.数组指针和指针数组:
1.数组指针:
作业:
int a[5] = {1, 2, 3, 4, 5};
int *p = NULL;
p = &a[0];
p = a;
数组的数组名a是指向数组第一个元素的一个指针常量
a == &a[0]
a 的类型可以理解为 int *
有两种情况除外:
1.sizeof运算时
2.&运算符
&int * == int **
&int [5] == int (*)[5]
访问下标为n的数组元素的方式:
a[n] == *(a+n) == *(p+n) == p[n]
int a[5] = {0};
int Fun(int parray[5]);
int Fun(int parray[], int len);
int Fun(int *parray, int len);
char str[32] = {0};
int Fun(char *pstr, int len);
char str[32] = {"hello world"};
int Fun(char *pstr);
注意:
字符串遍历:
int main(void)
{
char str[32] = {"hello world"};
char *pstr = NULL;
pstr = str;
while (*pstr != '\0')
{
pstr++;
}
}
封装一个函数,给定一个字符串,统计该字符串中大写字母、小写字母、数字和空格的个数
char str[256] = {0};
gets(str);
GetNum();
int GetNum(char *pstr, int *pDaxie, int *pXiaoxie, int *pKong, int *pShuzi);
while (*pstr >= 'a' && *pstr <= 'z')
{
xiaoxie++;
}
#include
#define N 256
int Mystrlen(char *pstr,int *pda,int *pxi,int *pko,int *psh)
{
int i = 0;
for(i = 0;i < N;i++)
{
if(pstr[i] >= 'A' && pstr[i] <= 'Z')
{
(*pda)++;
}
if(pstr[i] >= 'a' && pstr[i] <= 'z')
{
(*pxi)++;
}
if(pstr[i] == ' ')
{
(*pko)++;
}
if(pstr[i] >= '0' && pstr[i] <= '9')
{
(*psh)++;
}
}
return 0;
}
int main(void)
{
char str[N] = {0};
int danum = 0;
int xinum = 0;
int konum = 0;
int shnum = 0;
gets(str);
Mystrlen(str,&danum,&xinum,&konum,&shnum);
printf("大写字母:%d 小写字母:%d 空格:%d 数字:%d\n",danum,xinum,konum,shnum);
return 0;
}
封装一个函数MyStrcpy实现strcpy的功能
#include
int Mystrcpy(char *pa,char *pb)
{
while(*pa != '\0')
{
*pb = *pa;
pa++;
pb++;
}
*pb = '\0';
return 0;
}
int main(void)
{
char a[64] = {0};
char b[64] = {0};
gets(a);
Mystrcpy(a,b);
puts(b);
return 0;
}
封装一个函数MyStrcat实现strcat的功能
#include
int Mystrcat(char *pa,char *pb)
{
while(*pa != '\0')
{
pa++;
}
while(*pb != '\0')
{
*pa = *pb;
pb++;
pa++;
}
*pa = '\0';
return 0;
}
int main(void)
{
char a[64] = {0};
char b[64] = {0};
gets(a);
gets(b);
Mystrcat(a,b);
puts(a);
return 0;
}
封装一个函数MyStrcmp实现strcmp的功能
#include
int Mystrcmp(char *pa,char *pb)
{
while(*pa == *pb && *pa != '\0')
{
pa++;
pb++;
}
printf("%d\n",*pa - *pb);
return 0;
}
int main(void)
{
char a[64] = {0};
char b[64] = {0};
gets(a);
gets(b);
Mystrcmp(a,b);
return 0;
}
数组指针是指针,指针指向一个数组
指针数组是数组,数组每个元素都是指针类型
int *a[5] = {NULL};
定义一个指针数组,数组占40个字节空间,每个元素为int *型,共5个元素
int (*a)[5] = NULL;
定义一个数组指针变量,占8个字节空间,指针指向了一个int类型5个元素的数组
int a[5];
&a:获得数组的首地址,其类型为int (*)[5]
注意:
对一维数组数组名&,值不变,类型升级为数组指针类型
对数组指针*,值不变,类型降级成为指向数组第一个元素的指针
1.封装一个函数实现MyStrlen实现strlen的功能
2.封装一个函数实现MyStrcpy实现strcpy的功能
3.封装一个函数实现MyStrcat实现strcat的功能
4.封装一个函数实现MyStrcmp实现strcmp的功能
1,
#include
#define N 32
int Mystrlen(char *pstr,int *pnum)
{
while(*pstr != '\0')
{
(*pnum)++;
pstr++;
}
return 0;
}
int main(void)
{
char str[N] = {0};
int num = 0;
gets(str);
Mystrlen(str,&num);
printf("元素数:%d\n",num);
return 0;
}
2,3,4,同上练习
5.封装一个函数实现字符串的倒置(逆序)
int InvertString(char *pstr);
#include
#include
int invertstring(char *pzheng,char *pdao)
{
char tmp = '\0';
while(pzheng < pdao)
{
tmp = *pzheng;
*pzheng = *pdao;
*pdao = tmp;
pzheng++;
pdao--;
}
return 0;
}
int main(void)
{
char str[64] = {0};
int len = 0;
gets(str);
len = strlen(str);
invertstring(str,str + len - 1);
puts(str);
return 0;
}
6.从终端输入一个a和n封装函数按照如下公式获得结果
a:3
n:5
3+33+333+3333+33333 = 37035
#include
int fun(int a,int n)
{
int num = a;
int i = 0;
if(n == 1)
{
return a;
}
if(n == 0)
{
return 0;
}
for(i = 1;i < n;i++)
{
num = num * 10;
}
return fun(a,n-1) + (fun(a,n-1)-fun(a,n-2))+num;
}
int main(void)
{
int a = 0;
int n = 0;
int sum = 0;
printf("请输入a=,n=");
scanf("%d%d",&a,&n);
sum = fun(a,n);
printf("sum = %d\n",sum);
return 0;
}