字串反轉&&char *p 和char a[]區別
阿新 • • 發佈:2018-12-11
字串反轉函式
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