博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中的指针学习(小黑板)
阅读量:5160 次
发布时间:2019-06-13

本文共 2261 字,大约阅读时间需要 7 分钟。


 

指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结。

欢迎批阅。

 


 

(1)指针的含义

指针的本质也是数据类型,它是指向地址的变量。
例如:

{  int a = 10;  int *b = &a;//取a的地址}

以下为内存显示

地址 存储变量 存储的值
F1----> a(整形数据)<---10
F2----> b(指针类型)<---a的地址

所以应该注意的一点是指针类型数据要赋初值,不然会有危险

如果只声明指针变量而不作操作那么它本身的值就是存储区上一次程序遗留的值,

此刻他便被当为地址,如果你给此地址指向的变量赋值可能会修改系统内部东西,
这就是C语言的指针操作的危险性。
例如:

{  int *a;  *a = 10;}

在内存中

F1----> a (指针类型)<--- 内存本身的值(作为地址数据)

如果内存本身的值为00则他指向系统程序开始的那一部分

则你的赋值语句就是将00地址区域赋值为10则出现错误

注意:int* p,q;的意思是声明指针P声明int型变量q

(2)指针的应用

指针一般有两种常用应用
1>函数要返回多个值时,一个单纯的return就解决不了问题,需要用指针进行值传递。
函数传递的参数就是要保存结果的值。

swap(int *a,int *b){    int c = 0;    c = *a;    *a = *b;    *b = *a;}

2>函数需要返回状态(就是函数操作是否成功)时需要用指针传递结果,用return返回操作状态

例如:除法的函数

void chufa(int a,int b,int *result){    if(b == 0)    {         return 0;    }    else    {        *result = a/b;         return 1;    }}

(3)数组变量参数的含义

如下面的例子,声明了一个数组,则a其实就代表着数组a的起始地址,也就是a[0]的地址

则a就成为了指针型变量参数。

{    int ar[5];    int P = &ar[0];//int P = ar    //下面四种表示的含义相同,第一个参数进去的都是数组的首地址    int sum(int ar[],int n);    int sum(int [],int);    int sum(int *ar,int n);    int sum(int *,int);	}

内存中的显示

F1----ar[0]

F2----ar[1]
F3----ar[2]
F6----*P <----F1(ar[0]的地址)
则 p+1 <----F2 P+2 <----F3
*(P+1) = ar[1]
注意:数组ar是常量指针也就是const不能被赋值和改变!

(4)关于const与指针的关系

两种表示形式
1>
int *const q = &i;//q是const型指针
则q不能改变,可以对*q进行赋值,但不能改变q
2>
const int *p1 = &i;//表示不能通过*q去修改i
下面几种情况的区分要看const与*的位置关系,如果const在*的后面则表示指针不可修改。
反之则不能通过*p进行赋值
const int* p1 = &i;
int const* p2 = &i;
int *const p3 = &i;

应用:在函数中经常在数组型参数前面加const用以保护数组不受破坏。

(5)指针的运算

1>加一减一
int *a = &i;
a++;//a地址加一个int长度
a--;//a地址减一个int长度
在内存中这样
0xffffff64 ----> i
a = 0xffffff64
a++ 运算后a变为 0xffffff68
a-- 运算后a变为 0xffffff60

2>减法

两个相同类型的指针变量相减结果为他们相差多少倍的int的数据宽度

3>*P++运算

先赋值再加一。

4>比较运算

比较大小 > < == !=

5>void *p指针

代表含义是指针指向一块不知道大小的区域

//malloc动态内存分配

#include 
int main(){ int number; int *a; printf("请输入数量"); scanf("%d",&number); a = (int*)malloc(number*sizeof(int));//动态内存申请 for(int i=0;i

(6)指针与二维数组介绍

char a[10][10];//声明二维数组

char **P = &a[10][10];

指针变量    数组首地址形成一列                数组区域a[][]
P       ------->    a[0]      -------->   [第一行数组]//a[0]为二维数组的第一行首地址
p+1  ------->    a[1]      -------->   [第二行数组]//a[1]为二维数组的第二行首地址
p+2  ------->    a[2]

所以
P是a[0]的地址,a[0]是第一行数据的首地址。
故P是指针的指针。
以下例子:
*P 是 a[0]
**p 是 a[0][0]
*(*p+1) 是 a[0][1]

 

转载于:https://www.cnblogs.com/flyingjun/p/5165365.html

你可能感兴趣的文章
单链表 - 数据结构
查看>>
读写数据
查看>>
How Crushing Machinery Industry Better Develops Itself
查看>>
Spring框架的事务管理之声明式事务管理的类型
查看>>
身为多年的ubuntu用户。。。
查看>>
Educational Codeforces Round 24
查看>>
并查集 - 优化
查看>>
中文论文-LaTex模板
查看>>
P3538 [POI2012]OKR-A Horrible Poem
查看>>
CUDA高性能编程中文实战11章例子中多设备的例子编译提示问题
查看>>
Centos下安装软件的常用方法
查看>>
微信公众平台开发——为何不能在网页调用微信jsapi?
查看>>
emacs设置代理访问插件仓库
查看>>
wireshark自动化之tshark命令行
查看>>
Linux中more命令的实现
查看>>
P07: 有依赖的背包问题
查看>>
关于code::blocks的编译速度问题
查看>>
Jenkins 之邮件配置
查看>>
【转】达摩祖师《悟性论》
查看>>
wp8.1 页面返回 页面导航
查看>>