答疑:指针数组字符串
答疑课一
一指针&&数组
指针就是地址,为了方便去访问内存中的内容,给每个内存单元一个编号,这个编号就是地址,也就是指针
一、指针数组:~是数组
后面是什么就是什么
是数组,数组的元素是指针
int arr[3]==>int类型的数组
去掉数组名,剩下的就是数组本身的类型
元素类型 数组名 [长度]
类型 变量名
指针类型 指针名
指针类型 指针指向的类型(去掉*)
int* p=NULL;让指针置空,否则指针随意指向一个地址,会形成野指针
==> int类型的指针
星号跟着指针走
int *a, *b, *c;==>正确定义
int* a,b,c=>错误定义,这代表a是int*类型,b,c是int类型
定义一个指针数组
int a,b,c;
a=b=c=1;
int *pa,*pb,*pc;
pa=&a;
pb=&b;
pc=&c;
int* parr[3]={pa,pb,pc};
printf("%d \n", *pa);
printf("%d \n", *parr[0]);
//通过这两种方式都能得到a的值
//*parr[0]==>先算的是[0],因为括号优先级最高
//p[n] <<==>> *(p+n)
//所以*parr[0]==>*(*(parr+0))
二、数组指针:~指针
是指针,指向数组的指针
//定义数组指针
//1.定义一个数组
int arr[5]={0,1,2,3,4};
//2.定义一个指针parr指向数组arr
int (*parr)[5]=&arr;
//或者
typedef int(*PArr)[5];
typedef int(Arr)[5];
int arr[5]={0,1,2,3,4};
PArr p1=&arr;
Arr* p2=&arr;
三、综合运用
typedef int(*A)[2][3];
//一个指针数组 元素类型是指针 指针指向二维数组
//1.三个二维数组
int arr1[2][3] = { 0 };
int arr2[2][3] = { 0 };
int arr3[2][3] = { 0 };
//2.三个数组指针 指向三个数组
int(*parr1)[2][3] = &arr1;
int(*parr2)[2][3] = &arr2;
int(*parr3)[2][3] = &arr3;
//3.定义一个数组将这三个数组指针存下
A arr[3]={parr1,parr2,parr3};
int(*arr[3])[2][3] = { parr1,parr2,parr3 };
/*为什么要这样写:因为指针数组定义是
元素类型 数组名 [长度]
而对int(*arr[3])[2][3] = { parr1,parr2,parr3 };
这个数组的元素是parr1,2,3==》parr1的类型是int(*)[2][3]
练习题
//定义一个二维数组
char arr[3][10] =
{
"abcd",
"ABCD",
"012345"
};
//定义三个指针,分别指向arr的每一行
char* p1 = &arr[0];
char* p2 = &arr[1];
char* p3 = &arr[2];
//定义指针数组存指针
char* parr[3] = { p1,p2,p3 };
//定义数组指针,指向上面的数组
char*(*pp)[3] = &parr;
printf("%c\n", pp[0][1][1]);
include<assert.h> 断言
assert(条件) 条件为真继续程序,条件为假中断程序
二字符串及相关函数
一、使用
1.strcpy
#include <string.h>
char *strcpy( char *to, const char *from );
功能:复制字符串from 中的字符到字符串to,包括空值结束符(\0)
返回值为指针to。
是一个字符串对另一个字符串的覆盖
char* str1 = "abcdsqd";
char str2[20] = "12345";
printf("%s\n", str2);//输出12345
strcpy(str2, str1);
printf("%s\n", str2);//输出abcdsqd
二、自己实现
1.strcpy自己写一个封装函数实现其功能
#include<assert.h>
char* Mystrcpy(char* p1,const char* p2)
//这个返回值是char*类型的
{
assert(*p2 != '\0');
//只要p2还没有复制完就继续
char* ptemp =p1;
//用一个中间值来替换
while((*ptemp++=*p2++) != '\0');
//只要p2还能给p1复制就继续
return p1;
}
question1:
为什么第二个参数用const
answer:防止p2被修改
question2:
为什么要返回一个指针
answer:为了实现链式操作(套娃)
//将p1的内容一次性复制到str1和str2中
char* p1="abcd1234";
char str1[12]="swd";
char str2[12]="jlk";
strcpy(str2,strcpy(str1,p1));