1. 程式人生 > >C字串(一)

C字串(一)

#include <stdio.h>
#include "../include/c_string.h"

#define UNUSED 0

int main()
{
	sizeofAndStrlen();
	testspc();
	strArrOrPtr();
	initStr();
	return 0;
}

void sizeofAndStrlen()
{
	char str[] = "Hello Mike!";
	printf("sizeof = %d\n",sizeof(str)); //sizeof()計算型別的長度,即char[]型別的長度,包括空字元'\0'
	printf("strlen = %d\n",strlen(str)); // strlen()計算實際字串的長度,不包括空字元'\0'
}

void testspc()
{
	printf("%s,%p,%c\n","We","are",*"family"); //  第三個的解釋如下程式所示

	char *p = "family";
	printf("%p\n",p); 	// 首地址
	printf("%c",*p);	// 首地址上的值
}

void initStr()
{
	char s1[] = "You are good"; // 字串
	char s2[] = {'Y','o','u',' ','a','r','e',' ','g','o','o','d','\0'}; // 字串、字元陣列
	char s3[] = {'Y','o','u',' ','a','r','e',' ','g','o','o','d'}; // 字元陣列

	printf("s1 = %s\n",s1);
	printf("s2 = %s\n",s2);
	printf("s3 = %s\n",s3);	//???????????????? You are goodYou are good
}

void strArrOrPtr()
{
	/*
	 * 字串常量屬於靜態儲存類別,只會被儲存一次,在整個程式的生命週期記憶體在;
	 */

	char sa[] = "I am good";
	/*
	 * 陣列形式
	 * 陣列名sa是常量,不能更改;
	 * 程式執行時,記憶體為陣列分配arr_size大小的空間,將字串拷貝到陣列中;
	 * 此時,字串有兩個副本,一個在靜態記憶體中,一個在陣列中;
	 */

	const char* sp = "I am good";
	/*
	 * 指標形式
	 * 指標sp是變數,可用遞增運算子++、--;
	 * 程式執行時,記憶體為指標變數分配一個空間,將字串的地址儲存於此;
	 * 此時,字串只有一個副本,即在靜態記憶體中;
	 */

	printf("address of sa: %p\n",sa); // sa不同,表明是新開闢的陣列記憶體,與靜態記憶體地址不同
	printf("address of sp: %p\n",sp);
	printf("address of \"I am good\": %p\n","I am good"); // sp和"I am good"地址相同,表明指標指向靜態記憶體中字串常量所在位置

	/*
	 * 指標和陣列相同操作:陣列訪問、指標訪問
	 */
	printf("%d, %d\n",sa[1],sp[1]);
	printf("%d, %d\n",*(sa+1),*(sp+1));

	/*
	 *  不改變字串的內容,建議使用const修飾符指標
	 *  改變字串的內容,建議使用陣列
	 */

	/*
	 * 區分幾個概念:
	 * 指標的地址
	 * 指標的值
	 * 指標指向的資料
	 * 指標指向的資料的地址,即指標的值
	 */

#ifdef UNUSED
	//sp[0] = 'p';
	printf("address of sp: %p\n",sp);  //竟然無法輸出!!!
#endif
}