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);

在定义函数指针时请注意:函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。

 

指针函数:

个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

返回指针的函数,一般定义格式为:

类型标识符    *函数名(参数表)

 

原创粉丝点击