补充:字符串与二维数组与二级指针与函数参数

字符串与数组、指针

1. 一维数组、指针
对于字符串“ABCD”
一维数组:char str[] = "ABCD";  或者  char str[] = {'A', 'B', 'C', 'D', '\0'}; 或者 char str[5] = {'A', 'B', 'C', 'D', '\0'};
指针:char *p = "ABCD"; 或者 char *p = str;

2. 二维数组、二维指针
对于字符串“ABCD”,“abcd"
二维数组:
char str[][5] = {"ABCD", "abcd"};
// char str[][5] = {{'A', 'B', 'C', 'D', '\0'}, {'a', 'b', 'c', 'd', '\0'}};
printf("%s\n", str[0]);
printf("%s\n", str[1]);
printf("%c\n", str[1][0]);

指针指向二维数组:
注意:不能这样直接指向二维数组(二维数组是连续存储的,不需要也不能取2次地址):char **p = (char **)str;
应该这样:
char *p = str[0];
printf("%s\n", p);
printf("%c\n", p[0]);
或者用数组指针
char (*p)[3] = str;
char (*p)[5] = str;
printf("%s\n", p[0]);
printf("%s\n", p[1]);
printf("%c\n", p[0][0]);

一维数组作为函数参数

1. void fun(char p[], int len);
2. void fun(char *p, int len);
注意:即使形参定义为数组形式char p[],但是传输进去的实参是指针。此时使用sizeof获取的是真正的大小4,而不是数组的长度,所有数组的长度需要单独传入。

二维数组作为函数参数

1. void fun(char p[][10], int len);
注意:数组的列必须指定

二级指针

int a = 10;
int *p = &a;
int **p2 = &p;
// int *p, **p2;
// p = &a;
// p2 = &p;
printf("%d %d %d", a, *p, **p2);

二级指针作为函数参数

如何实现字符串赋值
1. 定义数组
// 传入的指针必须指向具体的内存,不能是空指针或野指针
void fun(char *str) {
memcpy(str, “abc”, 4);
}

int main(int argc, char *argv[]) {
    char arr[10];
    fun(arr);
    printf("%s\n", arr);
}
2. 定义指针
void fun(char *str) {
    str = (char *)malloc(4);
    if(NULL != str){  // 注意:str指向的地址有改变
        memcpy(str, "abc", 4);
        printf("str=%d\n", str);
        printf("str: %s\n", str);
    }
}

int main(int argc, char *argv[]) {
    char *p = NULL;
    printf("p=%d\n", p);
    fun(p);
    printf("p=%d\n", p);  // 注意:p指向的地址没有改变
    printf("p: %s\n", p);
}

指针P指向的内存地址还是0x0,没有改变
原因:指针就是内存地址,是long类型的数值。调用fun时,将地址拷贝传入。一般情况下,我们是使用或改变指针指向的内存的值,但是现在改变了指针的指向,指向了另一片内存。
3. 二级指针
void fun(char **str) {
    *str = (char *)malloc(4);
    if(NULL != *str){
        memcpy(*str, "abc", 4);
        printf("str=%d\n", *str);
        printf("str: %s\n", *str);
    }
}

int main(int argc, char *argv[]) {
    char *p = NULL;
    printf("p=%d\n", p);
    fun(&p);
    printf("p=%d\n", p);
    printf("p: %s\n", p);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值