【C语言疯狂讲义】(九)C语言指针(一)

1、什么是地址?

内存是由若干个1个字节的内存单元组成的存储器

计算机为了管理内存单元,给每个字节都进行编号

编号的就是地址

2、什么是指针?

地址就是指针

地址:

地址指向的内存单元值:编号对应的存储内容

变量访问的方法:直接访问   
间接访问

1)直接访问:用变量名访问其代表的存储空间

2)间接访问:通过内存地址访问地址所对应的存储单元的内容

3、指针和变量之间的关系

指针可以间接的访问变量的值

1)指针变量:就是用来存放地址的变量

指针变量也遵守变量使用的规则
:先定义  --->初始化 -->使用

2)如何定义一个指针变量

数据类型*
指针变量名;

int *p;

//变量名 p

//int表示什么意思?
表示指针变量只能存放一个整型数据的地址

//* 什么意思?    int p;//普通的整型变量,int *p;//指针变量

3)指针变量初始化

为什么要进行初始化?

首先,如果普通的一个变量没有初始化,会有什么后果?  //垃圾值

对于指针变量,int *p;   //p
随机的,p 0xff1111  10

*p = 10; //如果不初始化直接使用,可能会导致系统崩溃

野指针:定义之后,没有初始化

(1)定义的同时进行初始化

int *p=NULL;   //赋值为NULL ,表示谁都不指

int *p1 = 0;   //同上

int a=10;

int *p2=&a;

int *p3=&a;

int *p4 = p2;

p3 = p4;    //指针的指向可以改变

(2)先定义,后出初始化

int *p;

p = NULL;

int *p1;

p1=&a;

注意:

1)多个指针可以指向同一个变量

2)指针的指向是可以改变的

3) int *p;   p = 100;//错误的
存放的时地址,现在给的时整数值

4)*p = &a;错误  //*p是整型的变量,只能赋值数值

3)使用指针变量间接的访问变量值

int *p = &a;

*p  就是访问p中存放的地址代表的存储空间的值

p指向的存储空间的值

4、指针的应用场景

1)在被调函数中,修改主调函数的变量值

2)可以让函数有多个返回值

5、指针变量为什么要区分类型

前提:不同类型的指针变量在内存中占用8个字节

为什么都占用8个字节还要区分类型呢?

char *c;  //c存放的时地址   *c
从c存放的地址开始
,连续取1个字节

int *p;                   *p 从p存放的地址开始
,连续取4个字节

int a=10;

char *c2 = &a;    //从变量a的首地址开始,取了1个字节(实际4个,取少了)

double *d1 = &a;  //从变量a的首地址开始,取了8个字节(实际4个,取多了)

6、多级指针介绍

二级及以上的指针

一级:指针指向的是一个基本数据类型变量的地址

二级:指向的又是一个地址

int a = 10;

int *p = &a;   //p是一级

int **p1 = &p;  //p1 ---> p    p1是二级

7、指针和数组之间的关系

1)数组指针:

指向数组元素的指针变量

int a[5];    //a[0]  a[1] 直接访问

目标:用地址也可以访问数组元素

(1)数组名访问

a存放的是数组的首地址(常量)   == &a[0]

*a     ==   a[0]元素的值

a+1   指向数组的下一个元素

a-1   指向数组的上一个元素

*a+1   ==  a[0]+1;

*(a+1) ==  a[1]元素的值

int *p; //指针变量

p = a;  //p指向了数组a的第一个元素

p = &a[0];

p+1 指向数组的下一个元素

p-1 指向数组的上一个元素

*p  ==   a[0]元素的值

*p+1   ==  a[0]+1;

*(p+1) ==  a[1]元素的值

p = p+1;   //p移动到了下一个元素

p++;

*p++  == *(p++) == *(p = p+1)

2)指针数组:

指针数组:数组的每一个元素都是一个指针

int a[2][3]={1,2,3,4,5,6};    // a[0]  1,2,3    a[1] 4,5,6

int *pa[]={a[0],a[1]};

printf("%d\n",**(pa+1));    //4

时间: 2024-10-24 19:10:28

【C语言疯狂讲义】(九)C语言指针(一)的相关文章

【C语言疯狂讲义】(十六)C语言文件操作

1.文件的基本概念 存储外部介质上得数据集,数据集有一个名称就是文件名 文件的分类: 1)用户角度:普通文件和设备文件 2)存储的内容: ascii文件(文本文件): 存储的流程:根据文本找到其对应的ascii码值---->转为二进制--> 写到文件中 读取流程: 二进制-->10进制-->找对应的字符-->显示出来 二进制文件: 二进制数据的存取 文件的操作流程: 1)导入头文件  stdio.h 2) 定义文件指针 3)打开文件 4)操作文件 5)关闭文件 文件操作原理

【C语言疯狂讲义】(七)C语言进制转换

1.计算机中的进制 2进制:逢二进1      0  1 8进制:逢八进1      0  1   2  3  4  5  6  7 10进制:逢十进1  默认的进制  0 - 9 16进制:逢十六进1   0 - 9  A B C D E F      (内存的地址格式) 2.进制的转换问题 三个要素: 数位(0-7). 基数(每一位能取值的个数). 位权(数码*基数^数位).    101 = 1*2^0+0*2^1+1*2^2 数码(每一位设置) 转换:有得时候转换为人能识别的数制,要操作

【C语言疯狂讲义】(十六)C语言简易通讯录(未优化版)

<通讯录>开发用到得知识点 常量.变量的使用 全局变量 分支语句 函数 宏 循环语句 scanf和printf 数据 结构体 文件 指针* <通讯录>中解决的经典问题 数组元素如何删除(不使用链表) 开发调试环境:Mac os x10.10 + xcode6.1 通讯录主界面: 添加联系人界面 删除联系人界面 修改联系人界面 搜索联系人 #include <stdio.h> #include <string.h> /****** 宏定义 *******/ #

OC语言疯狂讲义学习笔记

1.关于nil和Nil及NULL的区别: nil: A null pointer to an Objective-C object. ( #define nil ((id)0) ) nil 是一个对象值. Nil: A null pointer to an Objective-C class. NULL: A null pointer to anything else. ( #define NULL ((void *)0) ) NULL是一个通用指针(泛型指针). NSNull: A class

李刚OC语言疯狂讲义笔记

设计一个”学生“类1> 属性* 姓名* 生日用结构体作为类的实例变量(生日) #import <Foundation/Foundation.h> //定义生日的结构体 typedef struct{ int year; int month; int day; }MyDate; @interface Person : NSObject { @public NSString *_name;//定义姓名 MyDate _birthday;//定义生日 } @end @implementatio

【C语言疯狂讲义】(八)C语言一维数组

1.数组的基本概念: 相同类型    若干个     有序 由若干个相同类型的数据组成的有序的集合 有序:存储地址连续 下标连续 数组名:用来存放数组首地址的变量 数组元素:构成数组的每一个数据 数组的下标:给数组的每一个元素做一个编号 数组的长度:构成数组的数据的个数 2.一维数组的定义 数组的使用的流程:先定义   ---> 初始化   --->使用 数组定义完成后,如果不初始化里面存放的时垃圾值 格式:int arr[10]; 定义长度为10的整型数组,每个都是Int型的,数组的名称 a

【C语言疯狂讲义】(三)C语言运算符

1.运算符: 连接两个操作数(常量.变量)的符号 用运算符按照一定的规则连接的式子称为表达式 运算符的分类: 1)操作数的个数: 单目运算(++     sizeof    !) 双目运算符:.... 三目运算符:  ?: 2) 功能: 算术运算符.关系和逻辑运算.位运算 2.算术运算符 1)什么东西? 进行算术的运算,总计5个 +  -  *  /  % 双目运算符 a+b   a*3   b/5    10%3 2)优先级 * /   3 + -   4 乘除的优先级要高于加减的 3)结合性

【C语言疯狂讲义】(四)C语言分支语句

1.程序的结构 程序默认从上到下顺序执行(顺序结构) 程序的结构:顺序结构.分支结构.循环结构 2.if分支语句 程序执行的过程中可以有多个选择 格式: if(表达式){ 语句块; } ...... 进行表达式的求值:如果表达式的值为非0(真) 会执行语句块 0 (假) 不会执行语句块, 3.if分支语句的几种形式 1)最简单的,要不执行,要不是不执行 if(表达式){ 语句块; } 2)if.....else...... if(表达式){ 语句块1: }else{ 语句块2: } 进行表达式的

《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代码一次性“翻译”成该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行文件格式,这个转换过程称为编译(Compile).编译生成的可执行程序可以脱离开发环境,在特定的平台下独立运行.有些还需要链接其他编译好的目标代码 编译型语言是程序在执行之前需要一个专门的编译过程,把程序