目的
C语言中的字符指针、字符数组跟字符串在程序中经常用到,下面的程序列出了对这些变量的一些简单操作以及输出结果:
源码charPointer.c
#include <stdio.h>
int main(){
char s1[]="abcde";
char s2[]={'f','g','h','i','j'};
char *s3;
printf("1:char[] s1: value \"abcde\"\nchar[] s2: value ['f','g','h','i','j']\nchar *s3: value null\n\n");
printf("2: strlen(s1)=%d\tstrlen(s2)=%d\n",strlen(s1),strlen(s2));
printf("sizeof s1 = %d\tsizeof s2 = %d\n\n",sizeof s1,sizeof s2);
printf("3: pointer:\ns1=0x%x\ns2=0x%x\ns3=0x%x\n\n",s1,s2,s3);
printf("pointer+1:\ns1+1=%c\ns2+1=%c\n\n",*(s1+1),*(s2+1));
s3=s1;
printf("4: let s3=s1\n");
printf("s3=0x%x,*s3=%c\t*(s3+1)=%c\n",s3,*s3,*(s3+1));
printf("s3+2=0x%x\n\n",s3+2);
s3=s2;
printf("5: let s3=s2\n");
printf("s3=0x%x\t*s3=%c\t*(s3+1)=%c\n\n",s3,*s3,*(s3+1));
printf("6: declare:char s4[6]\n");
char s4[6];
printf("try to assign s4=\"abcde\" or {\'a\',\'b\',\'c\',\'d\',\'e\'}\nError!\n\n");
// s4 = "abcde"; //error assignment!
//s4 = {'a','b','c','d','e'};
printf("7: declare:char *s5\n");
char *s5;
printf("try to assign s5=\"abcde\"\n");
s5="abcde";
printf("s5=%s\t it\'s ok\n",s5);
printf("try to assign s5 = {\'a\',\'b\',\'c\',\'d\',\'e\'}\nError!\n");
//s5 = {'f','g','h','i','j'};
//printf("s5=%s\n",s5);
return 0;
}
输出
1:char[] s1: value "abcde"
char[] s2: value ['f','g','h','i','j']
char *s3: value null
2: strlen(s1)=5 strlen(s2)=5
sizeof s1 = 6 sizeof s2 = 5
3: pointer:
s1=0xbf81fddb
s2=0xbf81fde7
s3=0xffffffff
pointer+1:
s1+1=b
s2+1=g
4: let s3=s1
s3=0xbf81fddb,*s3=a *(s3+1)=b
s3+2=0xbf81fddd
5: let s3=s2
s3=0xbf81fde7 *s3=f *(s3+1)=g
6: declare:char s4[6]
try to assign s4="abcde" or {'a','b','c','d','e'}
Error!
7: declare:char *s5
try to assign s5="abcde"
s5=abcde it's ok
try to assign s5 = {'a','b','c','d','e'}
Error!
Makefile
# This is a Makefile built by YBH on 2012/10/19 10:00
# Variables
TARGET=charPointer
SOURCE1=charPointer.c
# Compile command
# $@: target name, $TARGET in this section
# $<: first dependent file, $SOURCE in this section
$(TARGET):$(SOURCE1)
gcc -o $@ $<
# gcc -o $TARGET $SOURCE
一点总结
1、本程序用到了两种类型:字符数组和字符指针。字符数组的两种赋值方式“”和[ ]。
有的教程说字符数组(本例中的s1,s2)变量不能进行加减算数运算,但本例可以正常运行,没有出现错误。
字符指针进行加减运算没问题。
2、使用“”给字符串赋值:“”会产生一个新的字符串以及该字符串地址(char*,字符串指针变量),并将该地址赋值给字符数组变量或者字符指针变量。
char s[] = "abcd"; // sizeof s = 5
// s = “123456”; // error: incompatible tyeps when assigning to char [5] from type 'char*'
char s0[] = NULL; // 会产生一个char[1]的字符数组
// s0="123456"; // error: incompatible tyeps when assigning to char [1] from type 'char*'
char *s1=NULL; // s1地址0x0,内容为null
s1="12345"; // 将新的字符串地址传递给变量s1,it's ok
3、{}的用法比较少,好像只能在声明的时候才用到。
char s[] = {'1','2','3','4','5'};
char s1[4];
//s1 = {'1','2','3','4'}; //error: expected expression before '{' token
文件下载链接:源文件+Makefile+可执行文件