C指针浅析
来源:互联网 发布:团队工作安排软件 编辑:程序博客网 时间:2024/05/18 00:54
1.
只要是学过C或C++的人都知道其中指针的重要性,我们对它又爱又恨,爱的是他很强大,恨的是他过于强大以至于有那么多的变化,令人防不胜防。
笔者现在总结一下c指针中那些令人迷糊的概念:
2.1.0 指针初始化问题
intmain(void)
{
int*p;
*p= 0;
}
我们知道,在堆栈上分配的变量初始值是不确定的,也就是说指针p所指向的内存地址是不确定的,后面用*p访问不确定的地址就会导致不确定的后果,如果导致段错误还比较容易改正,如果意外改写了数据而导致随后的运行中出错,就很难找到错误原因了。像这种指向不确定地址的指针称为“野指针”(Unbound Pointer),为避免出现野指针。
2.1.1 指针引起的栈溢出
int main(void)
{
int*p = NULL;
...
*p= 0;
...
}
(解释见前一博客)
2.2非常好用的空指针
void func(void *pv)
{
/**pv = 'A' is illegal */
char*pchar = pv;
*pchar= 'A';
}
int main(void)
{
charc;
func(&c);
printf("%c\n",c);
...
}
注意,只能定义void *指针,而不能定义void型的变量,因为void *指针和别的指针一样都占4个字节,而如果定义void型变量(也就是类型暂时不确定的变量),编译器不知道该分配几个字节给变量。
2.3 指针与const
这个地方相信很多初学者都存在疑惑。
const int *a;
int const *a;
这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的。
int * const a;
a是一个指向int型的const指针,*a是可以改写的,但a不允许改写。
int const * const a;
a是一个指向const int型的const指针,因此*a和a都不允许改写。
2.3.1 字符型指针
int main(void)
{
char*p = "abcd";
...
*p= 'A';
...
}
p指向.rodata段,不允许改写,但编译器不会报错,在运行时会出现段错误。(上一篇博客中有提到)
2.4 指向数组的指针&&指针数组
int (*a)[10];&&int *a [10]应该如何理解呢?
我们可以认为[]比*有更高的优先级,如果a先和*结合则表示a是一个指针,如果a先和[]结合则表示a是一个数组。
int *a[10];这个定义可以拆成两句:
typedef int *t;
t a[10];
t代表int *类型,a则是由这种类型的元素组成的数组。int (*a)[10];这个定义也可以拆成两句:
typedef int t[10];
t *a;
t代表由10个int组成的数组类型,a则是指向这种类型的指针。
2.4.1 数组&&指针
int a[5][10];
int (*pa)[10] = &a[0];
两者都表示一个二维数组。
我们可以把pa当成二维数组名来使用,pa[1][2]和a[1][2]取的也是同一个元素,而且pa比a用起来更灵活,数组名不支持赋值、自增等运算,而指针可以支持,pa++使pa跳过二维数组的一行(40个字节),指向a[1]的首地址。
2.5 函数指针&&指针函数
函数指针:
函数类型(*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
double (*ptr)(double x);
在定义函数指针时请注意:函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。
指针函数:
个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。
返回指针的函数,一般定义格式为:
类型标识符 *函数名(参数表)
- C指针浅析
- C语言指针浅析
- 【C++】 浅析智能指针
- 浅析this指针(c++)
- 浅析c/c++中的指针
- 浅析C语言中的指针
- 浅析C指针(一)
- 新手入门学习:浅析c/c++中的指针
- c语言数组与指针浅析
- 浅析C语言中指针与数组
- C语言中函数指针数组浅析
- C、C++指向函数的指针(函数指针)浅析
- 对比C/C++,浅析Java里的指针和引用
- 指针浅析
- 指针浅析
- 浅析指针
- 指针浅析
- C语言:浅析指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
- 上海天文台实习的一个项目-根据卫星数据绘制南极星空分布图
- UITableView回调和table相关成员方法详解
- OpenGL step by step 一
- Button未设type属性时在非IE6/7中具有submit特性
- CSDN高校巡讲石大站—海尔公司云计算工程师刘卫涛关于“云计算,云电视”科技讲座
- C指针浅析
- java反射学习--操作私有成员
- tomcat启动与停止时自动运行代码
- python生成缩略图
- Longest Repeated subsequence HDOJ2890
- android 应用测试。
- 用Pomelo 搭建一个简易的推送平台
- VS2010 C/S模式winForm打包部署.详细!
- BT协议的工作过程