C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的利用C指针!

指针变量的定义初始化和解引用

内存如何编址?

内存中的每个字节都有唯一的编号(地址),内存地址按字节编号,其字长一般与主机相同,32位机器使用32位地址,最多支持2^32字节内存(4G)

地址是一个无符号整数,从0开始依次递增,通常地址写成16进制。

如何对变量进行寻址?

直接寻址

直接到变量名标示的存储单元中读取变量的值

scanf("%d", &a);//假如忘记写&符号,a的值被当成地址。比如a为100,则会覆盖内存中地址为100位置的值。

printf("a=%d\n",a);

间接寻址

通过其他变量间接地找到变量地址读取变量的值

用什么类型来存储地址? 指针Pointer类型

指针变量

具有指针类型的变量

保存32位地址值 sizeof(pa)是4个字节

用什么数据类型去理解他所指向的存储单元中的数据呢?

int *pa; int *pa = &a

int 指针变量指向的数据类型 称为基类型

指针变量的内容 &a

指针变量pa是变量a的指针

如何显示变量的地址

使用%p格式符

变量指针只能指向同一基类型的变量

使用未初始化的指针会怎样?

指针变量使用之前必须初始化

若不知指向哪里 那就指向NULL(stdio.h中 定义为0)

NULL是什么

空指针-值为NULL的指针 即无效指针

问题:p=0和p=NULL有什么区别

A:*p=NULL可以明确的说明p是指针变量,而不是数值型变量

问题:空指针就是指向地址为0的存储单元的指针对么?

A:不一定,并非所有编译器都是用0地址,某些编译器为空指针适用不存在的内存地址

如何访问指针变量指向的存储单元中的数据

通过间接寻址运算符访问(引用)指针变量指向的变量的值

指针的解引用(Pointer Dereference)

*pa

指针变量的定义和初始化

正确方式

int *pa,*pb;

错误方式

int *pa,pb;

需要严格注意区分

指针变量作为函数参数

指针变量的解引用如何理解

间接寻址运算符 此* 非彼*

只要pa指向a,*pa就是a的别名

指针变量做参数有何优势

基本类型的变量做函数参数

Call By Value Passing arguments by value

实参变量的值->形参(parameter)

在被函数中不能改变实参的值

指针类型的变量做函数参数

Simulating Call by reference- Passing arguments by reference

是参变量的地址->指针形参(pointer parameter)

在被调函数中可以改变实参的值

Call by value

#include

void Fun(int par);

int main()

{

int arg = 1 ;

printf("arg = %d\n", arg);

Fun(arg);

printf("arg = %d\n", arg);

return 0;

}

void Fun(int par)

{

printf("par = %d\n", par);

par = 2;

return 0;

}

Call by reference

#include

void Fun(int *par);

int main()

{

int arg = 1 ;

printf("arg = %d\n", arg);

Fun(&arg);

printf("arg = %d\n", arg);

return 0;

}

void Fun(int *par)

{

printf("par = %d\n", *par);

*par = 2;

return 0;

}

指针变量作形参为函数

提供了修改实参值的手段

实战:两数交换

方案一:使用指针变量

需要注意

* 要传递地址给指针

* 实参形参数据类型要一致

* temp为整形 这里不要写错为指针类型

int main()

{

int a = 5, b = 9;

Swap(&a, &b);

printf("a=%d,b=%d",a,b);

return 0;

}

void Swap(int *x, int *y)

{

int temp;

temp = *x;

*x = *y;

*y = temp;

}

方案二:通过数组

数组这里也是传引用

int main()

{

int a[2] = {5, 9};

Swap(a);

printf("%d,%d", a[0],

a[1]);

return 0;

}

void Swap(int p[])

{

int temp;

temp = p[0];

p[0] = p[1];

p[1] = temp;

}

想了解更多其他技术博文,后续更多文章可以在Montage GTD来订阅RSS啦

c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)相关推荐

  1. c语言strlen函数的作用是什么,c语言strlen函数的使用方法是什么

    c语言strlen函数的使用方法是什么 发布时间:2020-08-20 11:54:33 来源:亿速云 阅读:116 作者:小新 小编给大家分享一下c语言strlen函数的使用方法是什么,希望大家阅读 ...

  2. c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos()和fsetpos()使用.f ...

  3. C语言,函数不可返回指向栈内存的指针

    预备知识:内存的分类 C/C++程序占用的内存分为两大类:静态存储区与动态存储区.其示意图如下所示: 数据保存在静态存储区与动态存储区的区别就是:静态存储区在编译-链接阶段已经确定了,程序运行过程中不 ...

  4. C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include<stdio.h> fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos( ...

  5. 在c语言中 函数的作用是什么,C语言程序中函数的定义

    C语言程序中函数的定义 C语言的函数问题是困扰很多学者的问题的,c程序中什么是函数呢?下面啦小编为大家精心推荐的c程序中函数的定义,希望能够对您有所帮助. C语言读书笔记--函数 先来看看函数的一般形 ...

  6. c语言在函数中返回数组,关于C语言函数返回数组的问题

    关于C语言函数返回一个数组 c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意: 1.该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放. 可以是全局 ...

  7. c语言高函数正确形式,计算机二级C语言考点解析:函数

    小编所收集到的相关计算机二级C语言考点解析:函数的资料 大家要认真阅读哦! 一.库函数的正确调用 1.C语言提供了丰富的库函数,包括常用数学函数.对字符和字符串处理函数.输入输出处理函数等.在调用库函 ...

  8. c语言宏函数怎么传递宏参数_C语言中的宏参数评估

    c语言宏函数怎么传递宏参数 We can define a function like Macro, in which we can pass the arguments. When a Macro ...

  9. c语言自定义函数多个返回值,C语言函数返回值

    C语言函数返回值教程 如果,我们希望函数不返回任何值,那么我们需要显式的指明其返回类型为 C语言函数不返回值 语法 void funcName(paramType1 param1, paramType ...

  10. C语言 定义函数妇女 判定整数n,C语言 定义函数判断奇偶性

    问题描述: C语言 定义函数判断奇偶性 这学期新开C语言,自己对这门课比较感兴趣,所以预习了一些没学的东西. 然后看到这道题: 编程c语言输入一批正整数以0或负数为结束标志求奇数的和要求定义和调用函数 ...

最新文章

  1. 55道常见的计算机面试题
  2. 输入一个数组,逆序存放在另一个数组并输出
  3. WebClient 请求 https 页面出错:未能创建 SSL/TLS 安全通道
  4. Swift3.0语言教程使用路径字符串
  5. Java普通对象的内存配置
  6. 【网络编程】之十一、重叠IO Overlapped IO 完成例程
  7. VS2013引入boost库编译时出现'QueueUserAPC' : is not a member of '`global namespace'
  8. JAVA UDP网络编程学习笔记
  9. 关于分布式事务的几个问题
  10. line-height学习与总结
  11. 大学生JAVA程序员周记,java程序员实习周记.docx
  12. 举例理解哈夫曼树与哈夫曼编码
  13. [ 程序员那些事 ]程序员会修电脑?程序员到底是干嘛的?
  14. 中国电信计算机类校园招聘笔试题目,中国电信集团2019校园招聘笔试真题(计算机技术类-A卷)(精选).doc...
  15. 物联网-电力监控平台(汇总)
  16. win10 mysql 入站规则_WIn10防火墙入站规则设置无效
  17. P2123皇后游戏+P1080国王游戏
  18. HEVC的WPP(Wavefront Parallel Processing)并行处理方式
  19. Directx11教程四十六之FBX SDK
  20. 如何自学 Android 编程-----整理stormzhang的知乎问答

热门文章

  1. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第7章-保性能控制
  2. STM32的ISP升级详解
  3. 【leetcode】1051. Height Checker
  4. Kotlin 标准库中run、let、also、apply、with函数的用法和区别
  5. CSS之:active选择器
  6. glob及IO重定向
  7. Python爬虫框架Scrapy 学习笔记 6 ------- 基本命令
  8. 【HDOJ】2577 How to Type
  9. Qt动态多语言的实现(VS2012开发)
  10. mac80211解析之发送速率控制