1、请先看下面的代码
关注几点:
(1)、怎样使用字符串给字符数组赋值?
(2)、怎样使用字符串给字符指针赋值?
(3)、字符数组名与字符指针有的区别是?
- /* Name : char_array.c
- * Author : dyli
- * Write Date : 20110807,change 20121025
- * Description : Used to distinguish between an array of
- characters and the string pointer.
- * */
- #include stdio.h>
- #define ARRAY_LENGTH 15
- int main(int argc, char *argv[])
- {
- /* 用字符串给字符数组赋值 */
- char dyli_array[]/*[ARRAY_LENGTH]*/ = "isDyliArray";
- /* 字符串给字符指针赋值 */
- char *dyli_str_pointer = "isDyliStrPointer";
- /*Below you can see,the base Address of the character array can be obtained
- in three:
- 1,&+an array name;
- 2,&+ the first element of array.
- 3,the array name. */
- printf("/*-----------------------------------------------------------------*/\n");
- /* 取数组首地址 */
- printf("&dyli_array 代表数组的首地址%x\n",&dyli_array);
- /* 取首元素的地址 */
- printf("&dyli_array[0] 值也等于数组的首地址%x\n",&dyli_array[0]);
- /* 数组名代表首地址 */
- printf("dyli_array, 数组名同样指向数组的首地址 %x\n",dyli_array);
- printf("dyli_array数组的元素值 = %s,数组的实际长度为 %d\n",
- dyli_array,sizeof(dyli_array));
- printf("dyli_array数组的第一个元素值 = %c\n",dyli_array[0]);
- printf("/*****----------------------------------------------------------****/\n");
- /*Below you can see,the string pointer Variable itselt has an Address. */
- printf("\n字符串指针变量dyli_str_pointer的地址为 %x\n",&dyli_str_pointer);
- printf("用&dyli_str_pointer[0] 取数组第一个元素的地址: %x\n",&dyli_str_pointer[0]);
- printf("dyli_str_pointer变量里面存放的是字符串的首地址 %x\n",dyli_str_pointer);
- printf("dyli_str_pointer所指向的字符串为 %s,且字符串的长度为 %d\n",
- dyli_str_pointer,strlen(dyli_str_pointer));
- printf("使用字符串指针,输出字符串首个元素 %c\n",dyli_str_pointer[0]);
- printf("--------------------------------------------------------------------\n");
- getchar();
- return 0;
- }
2、运行结果
- [root@localhost c]# ./char_array
- /*-----------------------------------------------------------------*/
- &dyli_array 代表数组的首地址bf8e1fc8
- &dyli_array[0] 值也等于数组的首地址bf8e1fc8
- dyli_array, 数组名同样指向数组的首地址 bf8e1fc8
- dyli_array数组的元素值 = isDyliArray,数组的实际长度为 12
- dyli_array数组的第一个元素值 = i
- /*****----------------------------------------------------------****/
- 字符串指针变量dyli_str_pointer的地址为 bf8e1fc4
- 用&dyli_str_pointer[0] 取数组第一个元素的地址: 8048664
- dyli_str_pointer变量里面存放的是字符串的首地址 8048664
- dyli_str_pointer所指向的字符串为 isDyliStrPointer,且字符串的长度为 16
- 使用字符串指针,输出字符串首个元素 i
- --------------------------------------------------------------------
3、再看看这两者在内存里面的怎样分布的
(1)、char dyli_array[] = "isDaliArray";
(2)、char* dyli_str_pointer = "isDyliStrPointer";
dyli_str_pointer这是一个字符指针变量,变量就会有空间,也会有地址。
这个指针变量地址可以用&dyli_str_pointer来取; 它的空间里面存放的是字符串常量的地址,因为该常量的地址已经赋值dyli_str_pointer变量,故可以直接用dyli_str_pointer来取得。
而这个dyli_str_pointer所指向的字符串常量的元素,也可以用dyli_str_pointer[0],dyli_str_pointer[1].....dyli_str_pointer[*]号取得!!
4、认清两个本质:
(1)、静态字符数组,占据内存中一段连续的内存;数组都是以\0作为结束标志!
数组名,实则一个常量,故不能拿数组名赋值给数组名,它的值为连续内存的首地址;这个地址也是数组第一个元素的地址。
(2)、字符串,同样占据内存中一段连续的内存;
字符指针,是一个变量,其大小的4个字节,用来存放字符串占据的连续内存的首地址;另外,字符指针它本身也就地址!