您的位置:首页 > 编程语言 > C语言/C++

【C疯狂的教材】(九)C语言指针(一)

2015-10-03 19:45 253 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: