答疑:指针数组字符串

答疑课一

一指针&&数组

指针就是地址,为了方便去访问内存中的内容,给每个内存单元一个编号,这个编号就是地址,也就是指针

一、指针数组:~是数组

后面是什么就是什么

是数组,数组的元素是指针

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));
posted @ 2021-01-23 20:52  kisfly  阅读(99)  评论(0编辑  收藏  举报