C语言中的指针学习(小黑板)
指针是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 <stdlib.h>
int main()
{
int number;
int *a;
printf("请输入数量");
scanf("%d",&number);
a = (int*)malloc(number*sizeof(int));//动态内存申请
for(int i=0;i<number;i++)
{
scanf("%d",a[i]);
}
/*使用*/
free(a);//释放内存
return 0;
}
(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]
C语言中的指针学习(小黑板)的更多相关文章
- C语言中的指针的小标可以是负数
首先,创建一个正常的数组 int A[20];.然后用指针指向其中间的元素 int *A2 = &(A[10]); 这样,A2[-10 ... 9] 就是一个可用的有效范围了. 1 2 3 4 ...
- GO语言中的指针
http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- C语言中的指针加减偏移量
C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客 https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...
- 论C语言中二级指针和二维数组之间的区别
刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...
- C语言中的指针(二)
指针指向谁,就把谁的地址赋给指针,指针变量和指针指向的内存变量是不一样的.不停的给指针赋值,相当于是不断的改变指针的指向. 在开发中要避免野指针的存在,在指针使用完毕之后,记得要给指针赋值成为NULL ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
随机推荐
- webService 讲解
Web Service简介: Web Service 是构建互联网分布式系统的基本部件,可以将具有特定功能或者可复用应用程序封装. 技术组成要素: SOAP:Web Service的基本通信协议,由普 ...
- table tr分离并加圆角和阴影
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 函数textread
函数textread可以按列读取ascii 文件中的元素,每一列中可能含有不同的数据类型.这函数读取其他程序生成的数据表时非常地有用. 实际应用中也要经常要读取txt文件,这个时候就需要用到强大的te ...
- SQL*PLUS中批量执行SQL语句
SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...
- 转载--- SQL Server XML基础学习之<4>--XPath
T-SQL 支持用于查询 XML 数据类型的 XQuery 语言. XQuery 基于现有的 XPath 查询语言,并支持更好的迭代.更好的排序结果以及构造必需的 XML 的功能. 所以我们本章先 ...
- 忘记root口令的处理方法
最近在拜读<Unix & Linux 大学教程>这本书,这本书写得不错.关于Unix和Linux比较介绍比较深入根源,内容也比较详细,很值得去拜读. 在书中的附录中有一 ...
- Web开发知识点总结
前言:这是一篇简单的web开发知识点的总结,适用于刚开始学习编程的人来学习的.我是为了能够在熟记熟记这些知识点而总结的一篇文章. 1 什么是浏览器? (1) 浏览器就是接收浏览者的操作(打 ...
- Meteor错误:TypeError: Meteor.userId is not a function
问题描述: 浏览器console提示错误TypeError: Meteor.userId is not a function. 原因分析: 通过查看Meteor API文档,可知该函数由包accoun ...
- c#转义字符串中的所有正则特殊字符
/// <summary> /// 转义字符串中所有正则特殊字符 /// </summary> /// <param name="input"> ...
- Xcode7 网络请求报错
xcode7 网络报错: The resource could not be loaded because the App Transport Security policy reguir 原因:iO ...