C语言指针学习

1. 初识指针

        指针实际上就是地址,直线变量的存储位置,在32位系统中,一共由32根地址线组成,每根线独立表示0和1,每个地址是1个字节8位。为了表示这32位地址线,需要4个字节,因此,在32位系统中,指针变量大小即为4字节。

        指针的类型决定了指针进行解应用操作时,能访问的空间大小。int型能访问4个字节,char型只能访问一个。同时,指针类型决定了:指针+1 所跳过的字节个数。如int* p, p+1则相当于p后面4个字节的地址。

2. 字符指针

         通过采用字符指针指向字符串时,不能通过指针改变字符串,在编写代码时,声明指针一定要使用const进行修饰。

const char *p = "abcdef";
printf("%s" ,p);

        当使用字符数组存储字符串时,其本质上还是数组,数组名即为首元素地址(指针)。但是值得注意的是,字符串一旦被创建,就会存在于常量池中(C/C++会把常量字符串存储到单独的一个内存区域)。以字符数组形式创建的字符串,实际上是从字符串常量池中复制的一个版本,其存储地址不同,在修改时,只会修改自己复制的副本,并不会影响常量池中的字符串。为通过char指针指向字符串时,是直接指向的常量池中的字符串,因此,其无法通过指针对常量字符串进行修改,必须要加const进行修饰,而字符数组可以进行修改。

3.指针数组与数值指针

        指针数组实际上是一个数组,不过其每个成员变量类型为指针。

        数值指针实际上是一个指针,是指向数组的指针,存放可以存放数组的地址。

int arr[10] = {0};
//arr:首元素地址;
//&arr[0]:首元素地址;
//&arr:数组的地址

int *p[10];
//指针数组的声明
int (*p)[10] = &arr;
//数组指针的声明

4. 函数指针 

         在声明函数时,其函数名实际上即为函数的地址,为了存储这个函数名地址,需要用到函数指针。

int add(int x, int y)
{
    return x+y;
}

int main()
{
    int (*p)(int, int) = add;
    return 0;
}

        上方代码中的p即为函数,值得注意的是,除开p之外的部分,其实可以看出是函数指针的类型,即有两个int型形参,返回int值。

// int (* )(int, int)即为函数指针类型
// 对其进行重定义
 typedef int (* p_fun)(int, int);
//即将函数指针类型重定义为p_fun
//再次定义函数指针类型变量时:
p_fun p = add;

        函数指针的数组,与指针的数组一样:

int* p[5];
//表示一个数组,其中每个元素为int型指针,p即为指针数组

int (*p[5])(int, int)
//等效于 p_fun p[5]
//表示一个数组,其中每个元素为函数指针类型,即为函数指针数组


int (*(*p)[5])(int, int)
//等效于 p_fun (*p)[5]
//表示一个指针,为含5个函数指针类型的数组指针,即为函数指针数组的指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值