C语言指针概述:
1.计算机系统中,无论是存入或是取出数据都需要与内存单元
打交道,物理器件通过地址编码寻找内存单元。
2.地址编码是一种数据,C语言的指针类型正是为了表示这种
计算机所特有的地址数据。
3.存取内存单元是任何程序经常性的操作,前面按对象(或变量)
名称直接访问内存单元。
4.程序运行时申请到的内存空间只有地址没有名称,因此指针
成为访问动态内存的唯一工具。

地址和指针的概念:
1.程序中的数据对象总是存放在内存中,在生命期内这些对象
占据一定的存储空间,有确定的存储位置。
2.C语言将内存单元抽象为对象,就可以按名称来使用对象。
3.定义数据对象时,需要说明对象名称和数据类型。
4.数据类型的作用是告诉编译器要为对象分配多大的存储空间(单位为字节),
以及对象中要存储什么类型的值。
5.对象名称的作用是对应分配到的内存单元,允许按名称来访问。

定义变量后,程序可以在变量中存储值和取出值。

1.数据值100存储到i对应的内存单元,表达式i+ 100的值
存储到j对应的内存单元。
2.按对象名称存取对象的方式称为对象直接访问。
3.在容量可观的存储空间中,计算机硬件实际上是通过地址编
码而非名称来寻找内存单元的。
4.地址编码通常按无符号整型数据处理(没有负数),每个内
存单元都有一个地址,以字节为单位连续编码。
5.编译器将程序中的对象名转换成机器指令能识别的地址,
通过地址来存取对象值。

由于通过地址能寻找到对象的内存单元,因此C语言形象地把
地址称为”指针”,即一个对象的地址称为该对象的指针。

通过对象地址存取对象的方式称为指针间接访问。

C语言指针变量:

C语言将专门用来存放对象地址(即指针)的变量称为指针变量,
其数据类型为指针类型,定义形式:指针类型 *指针变量名,...

通过指针变量,可以间接访问(或间接存取)对象。

区分指针和指针变量:
指针是地址值,指针变量是存储指针的变量,
例如可以说变量i的指针是4000,而不能说变量i的指针变量是4000;
可以说指针变量p的值是4000,p既可以存储变量i的指针,
又可以存储变量j的指针。

特殊的指针类型void*:

获取对象的地址:通过取地址运算(&)获取对象的地址。

取地址运算得到的指针不仅值为对象的地址,而且还以对象

的数据类型作为指向类型,例如:

指针的间接访问:

通过间接引用运算(*)可以访问指针所指向的对象或内存单元。

间接引用(又称解引用)运算符在所有运算符中优先级较高,

其运算结果是一个左值,即expr所指向 的对象或内存单元;
expr必须是指针的含义,可以为地址常量、指针变量、指针运算表达式。

 指针变量的初始化与赋值:

取变量地址一定发生在该变量定义之后(这时才有地址) ,
否则是错误的。例如:

指针变量初始化时,地址初值必须是与指针变量同一指向类型
的地址值,例如:

指针变量可以进行赋值运算:

指针变量赋值时要求左值和右值必须是相同的指向类型,
C语言不会对不同指向类型的指针作隐式类型转换。例如:

指针的算术运算:
包括指针加减整数运算,指针变量自增自减运算,两个指针相减运算。
1.指针加减整数运算:
设p是一个指针(常量或变量),n是一个整型(常量或变量),
则p+n的结果是一个指针,指向p所指向对象的后面的第n个对象;
而p-n的结果是一个指针,指向p所指向对象的前面的第n个对象。

2.指针变量自增自减运算:
设p是一个指针变量,其自增自减运算包括p++、 ++p、p--、--p形式。

3.两个指针相减运算:
设p1、p2是同一个指向类型的两个指针(常量或变量),
则p2-p1的结果为两个指针之间对象的个数,如果p2的地址值
大于p1结果为正,否则为负。

指针的关系运算:
设p1、p2是同一个指向类型的两个指针(常量或变量),
则p2和p1可以进行关系运算,用于比较这两个地址的位置关系。

指针的类型转换:
设p是一个指针(常量、变量或表达式),可以对p进行显式类型转换,
一 般形式为:(转换类型* )p
对指针进行显式类型转换的结果是产生一个临时指针对象,
其指向类型为"转换类型",地址值与p的地址值相同,
但p的指向类型和地址值都不变。

指针的赋值运算:
指针可以进行赋值运算,前提是赋值运算符两边的操作数必须
是相同指向类型。例如:

void*指针可以做关系运算,表示两个指针的地址值比较。
void*指针可以指向其他任何类型,无需类型转换。
假定指针是有效的,可以将void* 指针显式类型转换为其他类型,
再使用间接引用。例如:

指针的const限定:
const限定符作用在指针类型有两种含义:
指向const对象的指针和const指针。

1.指向const对象的指针:
一个指针变量可以指向只读型对象,称为指向const对象的指针,
定义形式为:const 指向类型 *指针变量,.......;
即在指针变量定义前加const限定符,其含义是指针指向的对象是只读的,
即不允许通过指针来改变所指向的const对象的值。

例如const int *p;
这里p是一个指向const的int类型对象的指针,const限定
p指针所指向的对象类型,而并非p本身。
也就是说,p本身并不是只读的,在定义时不需要对它进行初始化。
可以给p重新赋值,使其指向另一个const对象。
但不能通过p修改其所指对象的值。

把一个const对象的地址赋给一个非const对象的指针变量是错误的。

如果指向const的指针所指的对象并非const,则可直接给该对象赋值
或间接地利用非const指针修改其值,毕竟这个值不是const的。重要的是要记住:
不能保证指向const的指针所指对象的值一定不被其他方式修改。

const指针:
一个指针变量可以是只读的,称为const指针, 定义形式为:
指向类型 *const指针变量,.......;

指向const对象的const指针:
可以定义指向const对象的const指针,形式为:
const 指向类型 * const 指针变量,......

C语言之指针用法总结的更多相关文章

  1. C语言的指针用法:输入一堆字符,把非字母的删去。

    char *p,a[20]; int i; gets(a);    //这个语句不同于getchar(),后者只能一次输入一个,而前者可以一次输完所有的字符!!! p=a;        //这个语句 ...

  2. C语言函数指针用法

    #include <stdio.h> #include <string.h> static void sayHello(); static void salute(); voi ...

  3. 编程基础-c语言中指针、sizeof用法总结

    1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...

  4. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  5. C语言二重指针与malloc

    (内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...

  6. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  7. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  8. go语言的指针类型

    一.指针与引用的相关概念 什么是指针? 指针,全称为指针变量,是用来存储内存地址的一种变量.程序中,一般通过指针来访问其指向的内存地址中的内容(数据). 什么是引用? 引用,是C++中提出来的一种新的 ...

  9. 浅谈c语言的指针

    对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...

随机推荐

  1. 列出display的值,说明他们的作用。position的值, relative和 absolute定位原点是?

    display的值: block 像块类型元素一样显示. none 像行内元素类型一样显示. inline-block 像行内元素一样显示, 但其内容像块类型元素一样显示. list-item 像块类 ...

  2. SSM项目整合第一步 注册登陆实现

    SSM项目整合第一步  注册: 项目目录: 一.数据库建表: 源码: ; -- ---------------------------- -- Table structure for t_user - ...

  3. Python--day68--Django ORM常用字段、不常用的字段、自定义字段

    ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...

  4. HDU 2844 混合背包、

    题意:一个人想买手表,给你n个价值的硬币,然后给你n个价值硬币对应的个数.但是呢,这个人只知道这个手表的价格不超过m元.问他最多能买多少种价值的手表 思路:dp背包专题 但是- - 一直不知道该怎么d ...

  5. 2009年NOIP普及组复赛题解

    题目涉及算法: 多项式输出:模拟: 分数线划定:模拟.排序: 细胞分裂:质因数分解: 道路游戏:动态规划. 多项式输出 题目链接:https://www.luogu.org/problem/P1067 ...

  6. Spring Boot 动态数据源(多数据源自动切换)

    本文实现案例场景: 某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基 ...

  7. [转]1.2 java web的发展历史

    前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...

  8. UVA 11996 Jewel Magic —— splay、序列的分裂与合并、LCP的哈希算法

    #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...

  9. pip安装python包时报字符编码错

    比如安装scikit-learn时报错: django ascii’ codec can’t encode character 原因是用户目录或用户名存在中文,ascii不能解码,解决办法是在Pyth ...

  10. TCP和UDP的联系和用途

    一.区别        二者都是有用的和常用的,如果纯粹从概念上区分二者就比较费解了,我们直接从功能上进行区分,简单明了:        这两种传输协议也就是合于适配不同的业务和不同的硬件终端.    ...