字符串反转&&char *p 和char a[]区别

本文深入探讨了字符串反转函数的实现方式,并对比了char指针与字符数组在内存布局和操作上的区别,同时讲解了二维字符数组的概念及内存分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串反转函数

int main03()
{
 char buff[] = "qwertyuio";
 char *p = buff;
 char *p1 = buff + strlen(buff) -1;
 printf("p1:%s\n",p1);
 while(p < p1)
 {
     char c = *p;
     *p = *p1;
     *p1 = c;
     p++;
     p1--;
 }
printf("%s\n", buff);
}
int exchange(char *rawStr)//取数组首地址就可以
{
    if(rawStr == NULL)
    {
        printf("buffer is NULL\n");
        return -1;
    }
    char *start = rawStr;
    char *end = rawStr + strlen(rawStr) -1;
    while(start < end)
    {
        char temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
    return 0;
}
int main()
{
    int ret =0;
    char buff[] = "qwertyuio";
    ret = exchange(buff);
    if(ret != 0)
    {
        printf("exchange failed!\n");
        return ret;
    }
    printf("%s\n", buff);
    return ret;

}

/***************************
我们来说说char *p 和char a[] 的区别
char *p = "1234567";
char a[] = "1234567";
前者改变其内容程序是会崩溃的,而后者完全正确。
上述两个变量的内存布局分别如下:
数组a需要在内存中占用8个字节的空间,这段内存区通过名字a来标志。也就是这个“1234567”是分配在栈上的,指针p则需要4个字节的空间来存放地址,这4个字节用名字p来标志。目前这个p指向某地连续的8个字节,即字符串"1234567"。char a[] 相当于将"1234567"分配到栈区,p指针变量本身在栈上,指向的内容在静态存储区 ,因此,当char *p = "ssss";不可以使用p[0] = 'b';进行赋值,当用char a[]="llll";后,完全可以使用s[0]='c';进行赋值,这是常规的数组操作。因此char *p 前一般都需要用const进行修饰,以免不必要的修改引起错误。

***************************/

int main()
{
char *p = "ssss";
char buff[] = "llll";
//p[0] = 'b';
buff[0] = 'c';
printf("p:%s\n",p+1);
printf("buff:%s\n",buff);

}

二维字符数组

mystr代表的是“aaa”的首地址,mystr+1会向后跳20个字节。
也就是“bbbb”  mystr是二维数组的首地址。在栈里分配内存空间

int main()
{
 char mystr[5][20] = {"aaa","bbbb","ccc","dddd","eeee"};
  printf("mystr:%s\n",mystr);
 printf("mystr:%s\n",mystr+1);
}

输出:

mystr:aaa
mystr:bbbb

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值