1 #include <stdio.h> 2 int main() 3 { 4 char* p1 = 1 ; 5 char* p2 = '1'; 6 char* p3 = "1"; 7 printf("%s, %s, %s", p1, p2, p3); 8 printf(' '); 9 printf(" "); 10 return 0; 11 }
char* p1 =1 ;表示将p1这个指针空间赋值1,那么p1指向了地址为1的内存空间;同理char* p2='1';将‘1’对应的ASCLL码(49)赋值给p2指针空间,则p2指向了地址为49的内存空间。这两个地址空间的内存段,都是低地址段,是系统预留的空间,用来拷贝内核代码的使用的,所以上层的应用程序,不能占用这部分空间——段错误
char* p3="1";p3是指针空间,分配四个字节大小的空间,用来存放地址值,p3指向的内存空间是char类型的,只分配一个字节空间。char* p3="1";此时p3空间存放的值是字符:‘1’和‘ ’。
printf(' ');由printf函数的原型:printf的第一个参数是一个指针类型的形参,那么将一个字符赋值该变量,出现的问题如上述。
c语言中的单引号和双引号:
单引号:表示字符常量
‘a’表示字符常量;在内存中占一个字节;‘a’+1表示‘a’的ASCLL码+1,结果为‘b’。
双引号:表示字符串常量
“a”表示字符串常量;在内存中占两个字节;“a”+1表示指针运算,结果指向“a”的结束符——‘ ’。
字符串表示的是字符串的首地址,所以:char abc ="a";实际上abc中存放的是“a”首地址的一个字节的内容(高地址位字节/低地址位字节)
逻辑运算符:&&,||,!
短路原则:&&见假为假;||见真为真
exp1&&exp2
exp1||exp2
对于&&,如果&&前面的表达式为假,那么&&之后的表达式不再计算(不再执行);对于||,如若前面的表达式为真,那么其后的表达式不再计算
!exp
对于!,单目运算符,其后表达式为0值时,!exp整体为真;其后的表达式为非0值时,!exp整体为假。
exp1?exp2:exp3
对于?:,当?前表达式为真时,整个表达式返回exp2的值,否则,整体返回exp3的值。不能直接作为赋值号的左值
*(a<b? &a,&b)=3; //作为左值得情况