优秀的编程知识分享平台

网站首页 > 技术文章 正文

二级指针作为函数参数的输入输出特性

nanyue 2024-08-25 10:37:04 技术文章 6 ℃

const的使用方法:

有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


typedef struct MyStruct
{
	int a;
	int b;
}MyStruct;

void fun(MyStruct* p)
{
	//指针可修改
	//p = NULL;//ok
	//指针指向的内存可修改
	//p->a = 10;//ok

}
void fun1(MyStruct const* p)
{
	//p = NULL;//ok
	//p->a = 10;//err
}
void fun2(MyStruct* const  p)
{
	//p = NULL;//err
	//p->a = 10;//ok
}
//p只读
void fun3(const MyStruct* const  p)
{
	MyStruct temp;
	temp.a = p->a;
}
int main()
{
	//const修饰一个变量为只读
	const int a = 10;
	//a = 100;//err  不可修改

	//指针变量,指针指向的内存是不同的概念
	char buf[] = "asdqwer";
	
	//从左往右看,跳过类型,看修饰哪个字符
	//如果是*,说明指针指向的内存不可修改
	//如果是指针变量,说明指针的指向不可修改

	const char* p = buf;
	//char const* p2 = buf; 与上等价
	//p[1] = '2';//err
	p = "qqqqwwww";//ok

	char* const p2 = buf;
	p2[1] = '3';
	//p2 = "asdasd";//err

	//p3为只读,指向不可修改,指向的内存也不可修改
	const char* const p3 = buf;
	//如何引用其他.c文件中的const 的变量
	extern const int aa;//不能赋值,只能声明
	printf("aa=%d\n", aa);

	//const修饰的变量 定义时初始化
	//c语言中 const通过间接赋值可以被修改
	const int b = 10;
	//b=100;//err
	int* q = &b;
	*q = 22;
	printf("%d,%d\n", b, *q);
    return 0;
}

二级指针作为函数参数的输出特性

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

int getMem(char*p)
{
    p = (char*)malloc(sizeof(char) * 100);
    if (p==NULL)
    {
        return -1;
    }
    strcpy(p, "asd");
    printf("p=%s\n", p);
    return 0;

}


int getMem2(char** p)
{
    if (p==NULL)
    {
        return -1;
    }
    char* temp = (char*)malloc(100);
    if (temp==NULL)
    {
        return -2;
    }
    strcpy(temp, "Aaaaaaaa");
    *p = temp;
   
    return 0;
}


int main()
{
    char* p = NULL;
    int ret = 0;

    ret = getMem2(&p);
    if (ret!=0)
    {
        printf("getMem err:%d\n", ret);
        return ret;
    }
    printf("p=%s\n", p);

    if (p != NULL)
    {
        free(p);
        p = NULL;
    }
    return 0;
}

二级指针作为输入的内存模型①

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


int main0401()
{
    //每个类型都是 char*
    char* p0 = "111111";
    char* p1 = "222222";
    char* p2 = "aaaaaa";
    char* p3 = "wwwwwww";
   
    //指针数组,指针的数组,它是一个数组,每个元素都是指针
    char* p[] = { "111111","222222","aaaaaa","wwwwwww" };
    //p[0]="111111"
    int n = sizeof(p) / sizeof(p[0]);//   16/4=4
    printf("sizeof(p)=%d\nsizeof(p[0])=%d\n", sizeof(p), sizeof(p[0]));

    for (int i=0 ; i < n; i++)
    {
        printf("%s\n", p[i]);
    }

    char* q[10] = { "111111","222222","aaaaaa","wwwwwww" };
    printf("sizeof(q)=%d\nsizeof(q[0])=%d\n", sizeof(q), sizeof(q[0]));// 40   4

    return 0;
}


int main0402()
{

    //指针数组,指针的数组,它是一个数组,每个元素都是指针
	char* p[] = { "222222","111111","wwwwwww","aaaaaa" };
    //char**q = { "222222","111111","wwwwwww","aaaaaa" };//err
    //p[0]="111111"
    int n = sizeof(p) / sizeof(p[0]);
    int i = 0;
    int j = 0;
    int* temp = NULL;

    printf("排序前:\n");
    for (i = 0; i < n; i++)
    {
        printf("%s ,", p[i]);
    }
    printf("\n");
    //选择法排序
    for (i = 0; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (strcmp(p[i], p[j]) > 0)
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
    }
    printf("\n排序后:\n");
    for (i = 0; i < n; i++)
    {
        printf("%s ,",p[i]);
    }
    printf("\n");
    return 0;
}

//void test(int a[])
void test(int* a)
{

}

void fun()
{
    int a[10];
    test(a);

}

//void print_Array(char* p[],int n)
void print_Array(char** p, int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%s ,", p[i]);
    }
    printf("\n");
}


void sort_Array(char** p, int n)
{
    char* temp;
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if (strcmp(p[i], p[j]) > 0)
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
    }
}

int main()
{
    //指针数组,指针的数组,它是一个数组,每个元素都是指针
    char* p[] = { "222222","111111","wwwwwww","aaaaaa" };
    //char**q = { "222222","111111","wwwwwww","aaaaaa" };//err
    //p[0]="111111"
    int n = sizeof(p) / sizeof(p[0]);

    printf("排序前:\n");
    print_Array(p, n);

    sort_Array(p, n);

    printf("排序后:\n");
    print_Array(p, n);

    return 0;
}

二级指针作为输入的内存模型②

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


int main0501()
{
    char a0[30] = "1111111111111";
    char a1[30] = "222222222222222";
    char a3[30] = "sssssssssssssss";
    char a4[30] = "cccccccccccccccc";

    //4个a[30]的一维数组
    //二维数组,可以省略第一个[]数组括号中的值,前提需要初始化完成
    //a代表首行地址,首行地址与首行首元素地址有区别,值相同g
    //区别:步长不同
    char a[][30] = { "1111111111111" ,"222222222222222" ,
    "sssssssssssssss" ,"cccccccccccccccc" };
    //a[0] = "111111111111111111111"
    printf("a:%d,a+1:%d\n", a, a + 1);

    char b[30];
    printf("&b:%d,&b+1:%d\n", &b, &b + 1);//相差30
    printf("b:%d,b+1:%d\n", b, b + 1);


    for (int i = 0; i < 4; i++)
    {
        printf("a[%d]=%s\n",i, *(a+i));//首行地址与首行首元素的地址相同
    }
    int n = sizeof(a) / sizeof(a[0]);
    printf("n=%d\n", n);

    return 0;
}


void print_Array(char a[][30],int n)
{
    printf("a:%d,a+1:%d\n",a,a+1);//步长30
    for (int i = 0; i < 4; i++)
    {
        printf("a[%d]=%s\n", i, *(a + i));//首行地址与首行首元素的地址相同
    }

}

void sort_Array(char a[][30], int n)
{
    char temp[30];
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (strcmp(a[i], a[j]) > 0)
            {
                //交换的是内存块
                strcpy(temp, a[i]);
                strcpy(a[i], a[j]);
                strcpy(a[j], temp);
            }
        }
    }

}

int main()
{
    char a[][30] = { "1111111111111" ,"222222222222222" , 
                    "sssssssssssssss" ,"cccccccccccccccc" };
    int n = sizeof(a) / sizeof(a[0]);

    printf("排序前:\n");
    print_Array(a,n);

    sort_Array(a, n);

    printf("排序后:\n");
    print_Array(a, n);

    return 0;
}

二级指针做输入的内存模型③

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


int main0501()
{
    char a0[30] = "1111111111111";
    char a1[30] = "222222222222222";
    char a3[30] = "sssssssssssssss";
    char a4[30] = "cccccccccccccccc";

    //4个a[30]的一维数组
    //二维数组,可以省略第一个[]数组括号中的值,前提需要初始化完成
    //a代表首行地址,首行地址与首行首元素地址有区别,值相同g
    //区别:步长不同
    char a[][30] = { "1111111111111" ,"222222222222222" ,
    "sssssssssssssss" ,"cccccccccccccccc" };
    //a[0] = "111111111111111111111"
    printf("a:%d,a+1:%d\n", a, a + 1);
    char b[30];
    printf("&b:%d,&b+1:%d\n", &b, &b + 1);//相差30
    printf("b:%d,b+1:%d\n", b, b + 1);
    for (int i = 0; i < 4; i++)
    {
        printf("a[%d]=%s\n",i, *(a+i));//首行地址与首行首元素的地址相同
    }
    int n = sizeof(a) / sizeof(a[0]);
    printf("n=%d\n", n);
    return 0;
}
void print_Array(char a[][30],int n)
{
    printf("a:%d,a+1:%d\n",a,a+1);//步长30
    for (int i = 0; i < 4; i++)
    {
        printf("a[%d]=%s\n", i, *(a + i));//首行地址与首行首元素的地址相同
    }
}
void sort_Array(char a[][30], int n)
{
    char temp[30];
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (strcmp(a[i], a[j]) > 0)
            {
                //交换的是内存块
                strcpy(temp, a[i]);
                strcpy(a[i], a[j]);
                strcpy(a[j], temp);
            }
        }
    }
}
int main()
{
    char a[][30] = { "1111111111111" ,"222222222222222" 
                    , "sssssssssssssss" ,"cccccccccccccccc" };
    int n = sizeof(a) / sizeof(a[0]);
    printf("排序前:\n");
    print_Array(a,n);
    sort_Array(a, n);
    printf("排序后:\n");
    print_Array(a, n);
    return 0;
}

两个小练习:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


/*
键值对("key= value")字符串,在开发中经常使用
要求1:请自己定义一个接口,实现根据key获取
要求2:编写测试用例
要求3:键值对中间可能有n多空格,请去除空格
注意:键值对字符串格式能如下
keyl= valuel ;
key2=       value2;
key3=value3;
key4      = value4;
key5     =      ;
key6      =;

int getKeyByValue(char *keyvaluebuf, char *keybuf,
char *valuebuf, int valuebuflen)
*/


int trimSpace(char* inbuf, char* outbuf)
{
    if (inbuf==NULL||outbuf==NULL)
    {
        return -1;
    }
    char* p = inbuf;
    int begin = 0;
    int end = strlen(p) - 1;
    int n = 0;;

    if (end<0)
    {
        return -2;
    }

    //从左往右移动,如果当前字符为空,而且没有结束
    while (p[begin]==' '&&p[begin]!=0)
    {
        begin++;//右移一位
    }
    //从右往左移动,如果当前字符为空
    while (p[end]==' '&&end>0)
    {
        end--;
    }
    if (end==0)
    {
        return -3;
    }
    n = end - begin + 1;//非空元素个数
    strncpy(outbuf, p+begin, n);
    outbuf[n] = 0;
    return 0;

}


int getKeyByValue(char* keyvaluebuf, char* keybuf,
    char* valuebuf, int* valuebuflen)
{
    /*
    keyvaluebuf="key4      = value4"
    keybuf="key4"    
    */
    if (keybuf==NULL||keyvaluebuf==NULL||
        valuebuf==NULL||valuebuflen==NULL)
    {
        return -1;
    }
    char* p = NULL;
    int ret = 0;
    //查找匹配键值
    // "key4      = value4"  寻找key4,找到返回首地址
    p = strstr(keyvaluebuf, keybuf);
    if (p==NULL)
    {
        return -2;
    }
    //如果找到了,重新设置起点位置,跳过"key4"
    //p= "      = value4"
    //"key4      = value4"->"      = value4"
    p = p + strlen(keybuf);
    
    //查到=
    p = strstr(p,"=");
    if (p == NULL)
    {
        return -3;
    }
    //如果找到,从新设置起点位置,跳过"="
    //p="= value4"
    //"= value4"->" value4"
    p = p + strlen("=");
    
    //取非空字符
    ret = trimSpace(p, valuebuf);
    if (ret!=0)
    {
        printf("trimSpace err:%d\n", ret);
        return ret;
    }
    //获取长度,通过*间接赋值
    *valuebuflen = strlen(valuebuf);

    return 0;
}

int main()
{
    char* keyVal = "key4      = value4";
    char* key = "key4";
    char value[100] = { 0 };
    int len = 0;
    int ret = 0;
    ret = getKeyByValue(keyVal, key, value, &len);
    if (ret != 0)
    {
        printf("getKeyByValue  err:%d\n", ret);
        return ret;
    }
    printf("val:%s\n", value);
    printf("len:%d\n", len);

#if 0
    char* p = "         saadsqwd         ";
    char buf[100] = { 0 };
    int ret = 0;
    ret = trimSpace(p, buf);
    if (ret!=0)
    {
        printf("trimSpace err:%d\n", ret);
    }
    printf("buf=%s\n", buf);
#endif

    return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

/*
有一个字符串1a2b3d4z
要求写一个函数实现如下功能
功能1:把偶数位字符挑选出来,组成一个字符串1
功能2:把奇数位字符挑选出来,组成一个字符串2
功能3:把字符串1和字符串2,通过函数参数,传送给main,并打印。
功能4:主函数能测试通过
int getStrlStr2 (char *source, char *bufl, char *buf2)
*/
int getStrlStr2(char* source, char* buf1, char* buf2)
{
    if (source == NULL || buf1 == NULL || buf2 == NULL)
    {
        return -1;
    }

    int n = strlen(source);//字符串长度
    int i = 0;
    for (i = 0; i < n; i++)
    {
        //如果是奇数为
        if ((i%2)!=0)
        {
            *buf1=source[i];//*(source+i)
            buf1++;
        }
        else  //如果是偶数位
        {
            *buf2 = source[i];//*(source+i)
            buf2++;
        }
    }
    //没有结束符
    *buf1 = 0;
    *buf2 = 0;
    return 0;
}

int main()
{
    char* p = "1a2b3d4z";
    char buf1[50] = { 0 };
    char buf2[50] = { 0 };
    int ret = 0;
    ret = getStrlStr2(p, buf1, buf2);
    if (ret != 0)
    {
        printf("getStrlStr2 err:%d\n",ret);
        return ret;
    }
    printf("buf1=%s\n", buf1);
    printf("buf2=%s\n", buf2);
    return 0;
}

Tags:

最近发表
标签列表