字符串反转函数
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