1. 程式人生 > >字串反轉&&char *p 和char a[]區別

字串反轉&&char *p 和char a[]區別

字串反轉函式

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