四---指针

来源:互联网 发布:linux怎么支持中文目录 编辑:程序博客网 时间:2024/04/30 01:27


1,指针

李明杰老师说过:“如果一个人说他c语言除了指针其它都学习的很好,那么可以说这个人没学过c语言。”可见指针在c语言中的重要性和复杂程度。和很多人一样,刚接触指针时我也感觉很晕摸不着头脑,但随着后面的学习和练习,天天面对指针使用指针,渐渐的对指针的认识会越来越熟悉。

指针和其他变量一样,在内存中占据一小块存储空间,如果说一个int类型变量的存储空间里肯定存储整数,一个double类型变量的存储空间中肯定存储小数,那么指针中存储的只有地址值。

数据在内存中存储着,为了能找导数操作数据,每个数据都有自己的地址值,拿到了地址就能按照地址对数据进行访问和操作,地址通常是16进制格式,比如:0xffc7什么的。每个指针变量中就存储着一个地址值,任何指针都占据8个字节存储空间,我理解为指针变量里存放的就是一个长整型数据。

指针的书写格式:

变量类型 *变量名;

其中变量类型可以使任何有效的变量类型比如:int , float , bool等,也可是某个对象的类型名例如:Person *p;。*符号没有实际意义,只是一个标示,表示*后面的变量是一个指针,它指向的是*前面的一个变量类型,指针里面只存储指向变量的地址值。

例如:

int a = 10;

int *p = &a;

则就成为指针p指向了变量a。

此时访问a的话就能得到值10,访问p的话则会的到a的地址值,访问*p的话就会直接找向内存中的a。

2,数组与指针

用指针指向一个数组时指针会指向数组的首个元素,数组的元素在内存中所在地址是依次递增的,例如:

int num[5] = {5, 13, 9, 37, 66};

int *p;

p = &num[0];

假设num这个数组的零角标元素5在内存中的地址值是0xffc3,那么2号角标元素13在内存的地址就是0xffc7,一个int类型数据占据4个字节空间,数组内的元素在0xffc3基础上一次递增,把零角标元素的地址传递给p,p就指向了数组num,这和:p = age;的效果是一样的。

此时访问数组成员除了用数组名加角标号:num[2], num[3]之外还可以用指针访问:*(p+2),*(p+3),或者直接p[2],p[3]。因为p+1就相当于在p存储的地址上加上4,此时地址会直接指向1角标元素的地址,同理*(p+2)就直接访问了角标2元素。

指针加1具体会给地址值加多少字节地址取决于指针类型:

int *            加4

char *          加1

double*        加8

可见加多少与指针类型的数据在内存中占用多少空间是一样的。

3,指针与字符串

用指针指向一个字符串时也是会把字符串的首个元素地址传给指针,但指针指向的字符串是不可改的,例如:

char name[] = ”haha”;

name[0] = H;

这是常规定义字符串的方法,用名称和中括号表示字符串变量,用双引号传入字符串初始化,可以用字符串名称加中括号元素角标的方法改变字符串的具体值。

char *name = ”haha”;

用指针定义的字符串是不能执行上见面类似改变字符的操作的,这个字符串其实是一个常量字符串,用指针定义的字符串存储在内存的常量区中。

如果定义一个字符串需要经常改动就利用数组创建,如果定义的字符串不需要修改而且经常使用,就用指针创建。

4,指向函数的指针

指针也可以指向函数,指向函数的指针格式为:

函数的返回值类型 (*指针名)(函数的形参数量和类型);

#include <stdio.h>

int sum (int a, int b)

{

    return a+b;

}

int main()

{

    int (*p)(int, int);

    p = sum;

    int c = p(5, 6);

    printf(”c = %d”, c);

    return 0;

}

int (*p)(int, int);其中(*p)是固定写法,左边的int代表指针将来指向的函数的返回值是int,右边的两个int带表指向函数有两个int类型的形参。用p = sum;指向sum函数后就可以用指针名来调用函数了。

指针可以指向一切在内存中占据存储空间对象和变量甚至函数,熟练的运用指针是对开发者的基本要求,只要分清指针存储的值,指针本身的地址值,指针指向对象的地址值,指针指向变量的值不要混淆就能掌握指针。

0 0
原创粉丝点击