A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//
//  指针总结.h
//  0730代码实践
//
//  Created by apple on 15-7-30.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#ifndef _730__________h
#define _730__________h


#endif

指针跟各种类型数据的结合分类
#warning---------->>>>>>>>>>>普通指针<<<<<<<<<<<<<<--------------
分为一级指针和二级指针
*******************************************************
----------------------指针概念与定义方法
1、指针变量

用来存放地址的变量,就是指针变量

2、指针?

就是地址

3、指针变量的定义


数据类型  *指针变量名;


int *p;   //定义了一个指针变量,变量名是p
//int表示,p只能存放一个int类型的变量的地址

char *p1; //定义了一个指针变量,变量名是p1
//p1只能存放一个char类型数变量的地址

int num=10;
char *p = &num; //警告


4、指针变量定义的注意事项

1)“*”  必须得有,如果没有就相当于定义一个普通变量
2)指针变量能用来存放数值或者字符之类的吗? 不能
3)指针变量,归根结底还是变量,也有全局和局部变量之分

----------------------指针变量初始化和引用
指针变量也是变量
指针变量的使用: 定义指针变量  ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)

指针变量如果不初始化会有什么后果?
结论:如果一个指针变量定义以后,如果不进行初始化
     这个指针变量存放的事一个垃圾数,这个指针变量,称之为 野指针

一定要避免操作野指针,因为可能会带来意向不到的错误
    int *p10;  //值是一垃圾值,有可能存放是系统程序的地址
    *p10 = 438; //可能会造成系统崩溃

*******************************************************


两个指针变量之间的运算

1)两个指针之间的减法运算

(1)0x0006  - 0x0003   =  3  (意义不大)

(2)常见的用法:两个指针都指向同一个数组

i.判断两个指针变量指向的元素是否连续
ii.判断两个指针变量之间相隔几个元素

int a[5]={1,2,3,4,5};
int *p = a; //p指向了数组的第一个元素
int *p1 = &a[3]; //p指向了数组的第四个元素


注意:两个指针变量之间没有加法运算


2)两个指针之间的关系运算

// p1 > p
//1    表示p1在高位
//0    p在高位或者他们指向了同一个位置
二级指针:如果一个指针变量存放的是另一个指针变量的地址,则称此指针变量为二级指针
int *p=&a;int **p1=&p;
指针为什么要区分类型?
        不同类型的指针变量在内存中占用8个字节
        为什么都占用8个字节还要区分类型呢?
        //如果定义指针变量不定义类型,那么它在取*也就是在取其中的值的时候,就不知道应该读取几个字节,而定义了类型之后,如果是Int类型的就读四个字节,char类型的就读一个字节。

#warning---------->>>>>>>>>>>指针与数组<<<<<<<<<<<<<<--------------
数组指针 与指针数组,其中数组指针有分为一维数组指针 和二维数组指针

*******************************************************

数组指针:

    指向数组元素的指针

数组指针的作用:

    使用数组指针间接访问数组的元素

数组指针的定义:

    int *p;

数组指针的初始化:

    int a[4]={1,2,3,4};

    int *p = a;  //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素

    int *p = &a[0]; //等价上面一句话

数组指针如何访问数组的元素:

    1)p+1   表示指向数组的下一个元素
    2)p-1   指向数组的上一个元素
使用数组指针和使用数组名的区别
    p = p+1
    *p++
   // p是一个指针变量,既然是一个变量,它存放的值是可以改变的
    printf(" *p++   = %d\n",*p++);
    printf(" *p = %d\n",*p);
//学习的误区:   数组名 a是一个常量  *(10++)
//数组名++ 这是错误的
   //printf(" *a++   = %d\n",*a++); //错误的
printf(" *a = %d\n",*a);

*******************************************************


二维数组指针

行指针,用来指向二维数组的每一行,存放的是行的首地址

定义格式:  数据类型  (*行指针变量名)[数组第二维的长度];

二维数组指针的初始化

int a[2][3];
int b[2][2];
float f1[4][4];

//假设我要定义一个指向数组a的一个行指针
// a  = &a[0]  = &a[0][0]  = a[0]
int (*p)[3] = a;

二维数组指针的使用

*(*(p+i)+j)  //就是获取二维数组的每个元素


int arr[2][3] = {1,4,7,2,5,8};
int (*p)[3] = arr;
/*
p是一个指向二维数组的指针,所以他存放的相当于数组名,也就是第一行地址

p+i    就代表着第i行的第一个元素的地址

*p   就代表着第一行第一个元素的地址

*(p+i)  就代表着第i行的对应的内容(第一个元素的地址)  *(p+i)  == a[i]

*(p+i)+j 就代表着第i行的第j个元素的地址

*(*(p+i)+j) 就代表着第i行的第j个元素的地址所对应的值

*/
a[0][0]=0x7fff5fbff810    a[0][1]=0x7fff5fbff814    a[0][2]=0x7fff5fbff818
a[1][0]=0x7fff5fbff81c    a[1][1]=0x7fff5fbff820    a[1][2]=0x7fff5fbff824

p = 0x7fff5fbff810     指向二维数组的第一个元素(第一行地址)的地址
p+1 = 0x7fff5fbff81c   第二行地址
*p = 0x7fff5fbff810    第一行第一个元素的地址
*p+1 = 0x7fff5fbff814  第一行第二个元素的地址
**p = 1 第一行第一个元素的地址所对应的值

*******************************************************
指针数组:

存放指针的数组,就是指针数组

指针数组的定义:

数据类型  * 数组名[数组长度];
int *pa[3];

//定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针)

指针数组的使用:

int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};

pa[0]  a的地址

pa

int arr[10] ={1,23};
int *p
double *p1;


指针数组
int arr[2][3] = {1,4,7,2,5,8};
int *pa[2] = {arr[0],arr[1]};
a[0][0]=0x7fff5fbff810    a[0][1]=0x7fff5fbff814    a[0][2]=0x7fff5fbff818
a[1][0]=0x7fff5fbff81c    a[1][1]=0x7fff5fbff820    a[1][2]=0x7fff5fbff824


&pa = 0x7fff5fbff800 指针数组的地址
pa = 0x7fff5fbff800      指针数组的数组名,指向数组第一个元素的地址&pa[0]
&pa[0] = 0x7fff5fbff800  第一个元素的地址
*pa = 0x7fff5fbff810     *&pa[0]指向数组第一个元素的地址所对应的内容
pa[0] = 0x7fff5fbff810   指向数组第一个元素的地址所对应的内容
*pa[0]=1    * arr[0]  也就是二维数组第一个元素的值

*******************************************************



#warning---------->>>>>>>>>>>指针与字符串<<<<<<<<<<<<<<--------------
字符串指针:

定义: char *字符串指针变量名 = "字符串内容";

用作:用来保存一个字符串

char *str = "zfbanzhang zaiyiqi";
//"zfbanzhang zaiyiqi" 这个字符串存储在常量去
//str 只保存了字符串常量的首地址
str = "I LOVE YOU";
//str是指针变量
//str重新指向另外一个字符串常量 "I LOVE YOU"
//保存的是 "I LOVE YOU" 字符串常量的首地址


#warning---------->>>>>>>>>>>指针与函数<<<<<<<<<<<<<<--------------
*******************************************************

指针函数:

    返回值是指针的函数

指针函数的定义

    指针类型 * 函数名(){
   
   
        return 地址;
    }

*******************************************************
函数指针变量

存放函数的首地址的指针变量就是函数指针变量

函数指针变量的定义

返回值类型  (*变量名)(函数的参数);

函数的声明:

int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);

//定义了一个函数指针 p1
//p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址

//函数指针的初始化

p1 = sum;  //sum存的就是函数在内存中的首地址

//注意:定义函数指针的时候,可以不用写形参名
int (*p1)(int ,int );


函数指针的使用

int sum(int x,int y){
   
    return x+y;
   
}

//1、定义函数指针
int (*p)(int ,int );
//2、给函数指针初始化
p = sum;  //p也指向了sum函数

//3、用函数指针间接的调用函数
//     (*p)(23,45);
int s = p(23,45);




4 个回复

倒序浏览
很详细!!!
回复 使用道具 举报
我是来顶贴的、、、、、
回复 使用道具 举报
厉害 厉害 厉害 厉害 真厉害
回复 使用道具 举报
努力的学。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马