深入理解C语言-深入理解指针
关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏。其实指针并不复杂,学习指针,要正确的理解指针。
指针是一种数据类型
指针也是一种变量,占有内存空间,用来保存内存地址
指针就是告诉编译器,开辟4个字节的存储空间(32位系统),无论是几级指针都是一样的
*p操作内存
在指针声明时,* 号表示所声明的变量为指针
在指针使用时,* 号表示操作指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
指针变量和它指向的内存块是两个不同的概念
- 给p赋值
p = 0x1111;只会改变指针变量值,不会改变所指的内容;p = p +1;``p++ - 给
*p赋值*p='a';不会改变指针变量的值,只会改变所指的内存块的值 - 等号左边
*p表示给内存赋值,等号右边*p表示取值,含义完全不同 - 等号左边
char *p(处理字符串,指针指向字符串首地址:char *p = buf;p++;) - 保证所指的内存块能修改,即不要出现野指针和指向系统内存区域以及修改常量区数据
指针是一种数据类型,是指它指向的内存空间的数据类型
指针步长(p++),根据所致内存空间的数据类型来确定
p++ = (unsigned char )p + sizeof(a);
结论:指针的步长,根据所指内存空间类型来定
通过*p/*p++ 来改变变量的值是指针存在的最大意义
指针变量和它指向的内存块变量
这完全是两码事
指针指向某个变量,就是把某个变量地址否给指针
指针实际上记录的就是地址
*p间接赋值成立条件
需要满足三个条件
- 2个变量(通常一个实参,一个形参)
- 建立关系,实参取地址赋给形参指针
*p形参去间接修改实参的值
int num = 0; //实参
int *p = NULL;
p = #
num = 1;
*p = 2; //通过*形参 间接 地改变实参的值
间接赋值的应用场景
- 在一个函数之内:
*p1++ = *p2++;
- 函数调用:
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 | 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语言-深入理解指针的更多相关文章
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- 深入理解C语言-深入理解void
void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据 void含义 void几乎只有注释和限制程序的作用,定义一个 ...
- 深入理解C语言-深入理解数组
数组,作为C语言中常见的复杂数据类型,了解其本质有助于深入了解C语言 数组概念 元素类型角度:数组是相同类型的变量的有序集合测试指针变量占有内存空间大小 内存角度:联系的一大片内存空间 数组初始化 数 ...
- 深入理解C语言-深入理解内存四区
数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别
1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...
- "深入理解C语言" 指针
本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ ]; ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
随机推荐
- 嵌入式linux修改日期时间
命令格式为: date -s 时间字符串 例如只修改系统的日期,不修改时间(时分秒) date -s 2012-08-02 或只修改时间不修改日期 date -s 10:08:00 当然也可以同时修改 ...
- ibatis查询列表跟总记录,都引用相同SQL
在查询记录集合跟查询记录总记录数的时候,我们需要所写的SQL要一样,那么可以都引用同一个SQL.写法如下: <sqlMap namespace="Server"> &l ...
- 小tip: 使用SVG寥寥数行实现圆环loading进度效果(转载)
设计师设计了一个图片上传圆环loading进度效果.如下截图: 首先,CSS3是可以实现的,以前写过一篇转大饼的文章:“CSS3实现鸡蛋饼饼状图loading等待转转转”.原理跟这个一模一样,两个半区 ...
- 1 Mybatis
1 使用Maven导入mybatis依赖 在pom.xml中写上一下代码:这些代码的查找可在https://mvnrepository.com/open-source网站上寻找,导入mybatis时要 ...
- INLINE HOOK过简单驱动保护的理论知识和大概思路
这里的简单驱动保护就是简单的HOOK掉内核API的现象 找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节.5个字节就是一个简单的JMP指令.这里说一下JMP指令,如下: 00 ...
- luogu4930
P4930 「FJ2014集训」采药人的路径 题目描述 采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳 ...
- Palindrome Degree(CodeForces 7D)—— hash求回文
学了kmp之后又学了hash来搞字符串.这东西很巧妙,且听娓娓道来. 这题的题意是:一个字符串如果是回文的,那么k值加1,如果前一半的串也是回文,k值再加1,以此类推,算出其k值.打个比方abaaba ...
- Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...
- PHP学习之PHP代码的优化
if代码块的优化 if(1===$orderState){ $status='success'; }else{ $status='error'; } return $status; 简 ...
- 数据库 | SQL语法优化方法及实例详解
使用复合索引 如果经常执行如上查询,那么建立三个单独索引不如建立一个复合索引,因为三个单独索引通常数据库每次执行只能使用其中一个,虽然这样比不使用索引而进行全表扫描提高了很多效率,但使用复合索引因为索 ...