最近很糟心,在面试,被打击的也很大,一直在用C语言,然后有些东西,用起来突然就觉得模糊了,真的烦!作为刚毕业不久的我,真的糟糕透了。我曾以为年纪轻轻,就到了人生的低谷,后来才发现我的下降空间好很大!
一、C语言中,为什么字符串可以赋值给字符指针变量
char *p,a='5';
p=&a; //显然是正确的,
p="abcd"; //但为什么也可以这样赋值??
问:一直理解不了为什么可以将字串常量赋值给字符指针变量
答:双引号做了3件事:
1.申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了'/0'
3.返回地址
你这里就是 返回的地址 赋值给了 p
二、
char *p = “hello”;
上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了
解释:
字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。
所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。
char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的
如果写成char a[10]
然后 a = “hello” 这样就错误了。
同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理
但是换成char a [10]
然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。
代码测试
#include <stdio.h>
int main()
{
char *p = "hello";
printf("%s",p);
char a[10];
a = "hello";
return 0;
}
error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'
There is no context in which this conversion is possible
看到这样的错误提示,你是否会想到把char a[10]改成char a[6]呢
试一下,
error C2106: '=' : left operand must be l-value
运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。
继续扩展问题:
在使用指针的时候,指针可以自增,而数组不能自增
编译器给数组分配了空间,数组a的地址就是一个常量了,让常量自增这肯定是不行的。
继续扩展:
在指针自增的时候,编译器会自动识别类型,比如指针是指向int型的,想获取下一个的地址时,指针直接p++就行了,不要多此一举的p+4了
特别需要注意的是,在void指针使用的时候,不能使用指针运算,应为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型
详情请看:
https://www.cnblogs.com/skullboyer/p/7807543.html
http://c.biancheng.net/cpp/html/476.html
下面将函数、指针、数组结合起来:
int *fun(int *i);
int **fun(int i);
int *(*pfun)(int i); //pfun是一个指针,指向带一个int*的参数且返回int*类型的函数
下面再来一个好玩的
(*(
void
(*) ())
0)();
//1、void(*) ()这是函数指针类型,无参数,无返回值2、void(*) ()0 这是将
0
强制转换为函数指针类型,
0
是一个地址,也就是说一个函数存在首地址为
0的一段区域内。3、(*(
void
(*) ())0),着就是解引0这个地址里的函数。4、(*(
void
(*) ())
0)()就是调用
下面在来一个更好玩的
(*(
char
**(*) (
char
**,
char
**))
0
) (
char
**,
char
**);//其实和上面一样,不过这个函数带有两个char**的参数,返回char**的类型。
三、函数指针数组
char
* (*s[
3
])(
char
* p);//1、s[3]定义了一个数组。2、数组的元素都是char*(*)(char*p),也就是函数指针类型。
四、函数指针数组的指针
char
* (*(*pf)[
3
])(
char
* p);//1、(*pf)[
3
]定义内含3个元素的数组指针。2、元素的类型为char*(*)(char*p)
总结:总之一句话指针也是一种类型,它和int、char等大都一样,不要想的那么复杂。