zoukankan      html  css  js  c++  java
  • 答疑:指针数组字符串

    答疑课一

    一指针&&数组

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

    一、指针数组:~是数组

    后面是什么就是什么

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

    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 
    ", *pa);
    printf("%d 
    ", *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
    ", pp[0][1][1]);
    

    include<assert.h> 断言

    assert(条件) 条件为真继续程序,条件为假中断程序

    二字符串及相关函数

    一、使用

    1.strcpy

     #include <string.h>
     char *strcpy( char *to, const char *from );
    

    功能:复制字符串from 中的字符到字符串to,包括空值结束符()

    返回值为指针to

    是一个字符串对另一个字符串的覆盖

        char* str1 = "abcdsqd";
    	char str2[20] = "12345";
    	printf("%s
    ", str2);//输出12345
    	strcpy(str2, str1);
    	printf("%s
    ", str2);//输出abcdsqd
    

    二、自己实现

    1.strcpy自己写一个封装函数实现其功能

    #include<assert.h>
    char* Mystrcpy(char* p1,const char* p2)
    //这个返回值是char*类型的
    {
       assert(*p2 != '');
        //只要p2还没有复制完就继续
        char* ptemp =p1;
        //用一个中间值来替换
        while((*ptemp++=*p2++) != '');
        //只要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));
    
  • 相关阅读:
    字典转模型
    iOS开发之---传值大全
    UITableViewCell重用机制
    通知/代理/block 三者比对
    内存的那些事
    C++
    C#接口实现案例
    4.2 C#-----------------------------操作符的重载------------------------------------------
    C#抽象类和抽象方法的实现
    C#----析构函数
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/14318956.html
Copyright © 2011-2022 走看看