关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏。其实指针并不复杂,学习指针,要正确的理解指针。

指针是一种数据类型

指针也是一种变量,占有内存空间,用来保存内存地址

指针就是告诉编译器,开辟4个字节的存储空间(32位系统),无论是几级指针都是一样的

*p操作内存

在指针声明时,* 号表示所声明的变量为指针

在指针使用时,* 号表示操作指针所指向的内存空间中的值

*p相当于通过地址(p变量的值)找到一块内存;然后操作内存

*p放在等号的左边赋值(给内存赋值)

*p放在等号的右边取值(从内存获取值)

指针变量和它指向的内存块是两个不同的概念

  1. 给p赋值p = 0x1111;只会改变指针变量值,不会改变所指的内容;p = p +1;``p++
  2. *p赋值*p='a';不会改变指针变量的值,只会改变所指的内存块的值
  3. 等号左边*p表示给内存赋值,等号右边*p表示取值,含义完全不同
  4. 等号左边char *p(处理字符串,指针指向字符串首地址:char *p = buf;p++;)
  5. 保证所指的内存块能修改,即不要出现野指针和指向系统内存区域以及修改常量区数据

指针是一种数据类型,是指它指向的内存空间的数据类型

指针步长(p++),根据所致内存空间的数据类型来确定

p++ = (unsigned char )p + sizeof(a);

结论:指针的步长,根据所指内存空间类型来定

通过*p/*p++ 来改变变量的值是指针存在的最大意义

指针变量和它指向的内存块变量

这完全是两码事

指针指向某个变量,就是把某个变量地址否给指针

指针实际上记录的就是地址

*p间接赋值成立条件

需要满足三个条件

  1. 2个变量(通常一个实参,一个形参)
  2. 建立关系,实参取地址赋给形参指针
  3. *p形参去间接修改实参的值
int num = 0; //实参
int *p = NULL;
p = #
num = 1;
*p = 2; //通过*形参 间接 地改变实参的值

间接赋值的应用场景

  1. 在一个函数之内:
*p1++ = *p2++;
  1. 函数调用:
int getStr(int *a)
{
···
}

函数调用时,用n指针(形参)改变n-1指针(实参)的值

改变0级指针(e.g. int num = 1)的值有2种方式

改变1级指针(e.g. char *p = 0x1111)的值,有2种方式

改变2级指针的(e.g. char **pp = 0x1111)的值,有2种方式

函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来

间接赋值的推论 ==> 指针做函数参数

指针作为函数参数的精髓

  • 用1级指针(形参)去改变了0级指针(实参)的值(通过*p去间接修改了实参的在值)
  • 用2级指针(形参)去改变了1级指针(实参)的值(通过*p去间接修改了实参的在值)
  • 用3级指针(形参)去改变了2级指针(实参)的值(通过*p去间接修改了实参的在值)
  • 用n级指针(形参)去改变了n-1级指针(实参)的值(通过*p去间接修改了实参的在值)

深入理解指针必须和内存四区概念相结合,注意指针的输入输出特性

####主调函数 被调函数

  1. 主调函数可把堆区、栈区、全局数据内存地址传给被调用函数
  2. 被调用函数只能返回堆区、全局数据

内存分配方式

指针做函数参数,是有输入和输出特性的

应用指针必须和函数调用相结合(指针做函数参数)

序号 指针 堆栈 主调函数参数 被调函数参数 备注
1 1级指针(做输入) 分配 使用 一般禁用
    分配 使用 常用
2 1级指针(做输出) 使用 传出结果 常用
3 2级指针(做输入) 分配 使用 一般禁用
    分配 使用 常用
4 2级指针(做输出) 使用 分配 常用,不建议用,一般转为2
5 3级指针(做输出) 使用 分配 不常用

1级指针做输入

int showbuf(char *p);
int showArray(int *p; int num);

1级指针做输出

int getLen(char *pFileName, int *pFileLen);

2级指针做输入

int main(int argc, char *args[]);//指针数组
int shouMatrix(int [3][4], int len);//二维数组字符串

2级指针做输出

int getData(char **data, int *dataLen);
int getData_Free(void *data);
int getData_Free(void **data);//避免野指针

3级指针做输出

int getFileAllLine(char ***content, int *pLine);
int getFileAllLine_Free(cahr ***content, int *pLine);

深入理解C语言-深入理解指针的更多相关文章

  1. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  2. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  3. 深入理解C语言-深入理解void

    void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据 void含义 void几乎只有注释和限制程序的作用,定义一个 ...

  4. 深入理解C语言-深入理解数组

    数组,作为C语言中常见的复杂数据类型,了解其本质有助于深入了解C语言 数组概念 元素类型角度:数组是相同类型的变量的有序集合测试指针变量占有内存空间大小 内存角度:联系的一大片内存空间 数组初始化 数 ...

  5. 深入理解C语言-深入理解内存四区

    数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...

  6. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

  7. C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别

    1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...

  8. "深入理解C语言" 指针

    本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ ]; ...

  9. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

随机推荐

  1. 一个restframework快速实例

    首先在settings.py中引入 INSTALLED_APPS = [ ...... 'rest_framework', ......] 相关模型结构如下: class custume(models ...

  2. Codeforces Round #456 (Div. 2) 912D D. Fishes

    题: OvO http://codeforces.com/contest/912/problem/D 解: 枚举每一条鱼,每放一条鱼,必然放到最优的位置,而最优位置即使钓上的概率最大的位置,即最多的r ...

  3. Luogu P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III 分块

    这才是真正的$N\sqrt{N}$吧$qwq$ 记录每个数$vl$出现的位置$s[vl]$,和每个数$a[i]=vl$是第几个$vl$,记为$P[i]$,然后预处理出块$[i,j]$区间的答案$f[i ...

  4. tensorboard 远程服务器本地浏览器无法显示

    在用xshell等ssh工具远程连接服务器时,我们常常在服务器上运行tensorflow代码,而且模型tf.summary保存文件在服务器上,这是直接采用tensorboard会有一些小问题.直接用t ...

  5. T2695 桶哥的问题——送桶 题解

    校内测试 ------T2 看完这个题,就觉得和贪心那一块的任务调度很像,于是思路就是贪心啦! 蒟蒻的我,也就只能想到用贪心了,但是不知道怎么用qwq 这是我考试当时的思路,数据水骗了80分qwq: ...

  6. 两个字说清楚编程语言实质-Python基础前传(3)

    大家都知道Python对于数据分析而言,意义重大.但对于运用Python来做数据分析的我们来说,学习一门编程语言,却有不小的难度:首先大部分伙伴不是计算机相关专业的科班出身,其次我们基本上也都没有程序 ...

  7. nuxt使用教程

    1 引言 Nuxt 是基于 Vue 的前端开发框架,这次我们通过 Introduction toNuxtJS 视频了解框架特色以及前端开发框架的基本要素. nuxt 与 next 结构很像,可以结合在 ...

  8. TCO14 Wildcard CountTables——斯特林反演

    不知道咕了多长时间的题... 讲了3遍,还是自己搞懂了.. 暂时没有找到题目链接 题意: n×m的网格,每个格子填[1,x]的数,使得不存在两行两列同构. 先保证一个,行相同. 再容斥掉列. 枚举至多 ...

  9. java实现二维码的生成与解析

    简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反,就是将一张经过编码的图片解析为数字或者文字. 当然 ...

  10. 更新ubuntu的对应源配置文件

    UBUNTU中安装依赖包,出现如下错误:E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/o ...