课堂总结3

来源:互联网 发布:最新软件开发平台 编辑:程序博客网 时间:2024/06/14 16:38

初识指针

①指针引用三步
1)int *p=NULL;//定义一个指针变量
2)p=&a; //指针绑定
3)*p=1;//指针解引用
初始化
int *p = NULL; //NULL专用于指针的初始化(写0)
如果不进行初始化,指针将变成野指针
野指针危害:1、直接指向内核区 2、指向可用也没有别的数据的区域 3、可用但有别的数据的区域
②const 与指针
如定义int const *p1;
p=&a;
解引用*p1=11;//error: assignment of read-only location ‘*p1’

定义 const int * p2;// p2 ,p2所指向的数据(int) 等同于p1
int * const p3;// 野指针 修饰p3,p3不可改, 也就是说p3所指向的内容可改变
const int *const p4; // 必须定义时 同时初始化 两者都不能变
1、const修饰只读变量,2、在C++里面对const进行了扩展,标识常量。

指针与数组的基本运用:
①定义int arr=[1,3,5,6,7];
int *p;
arr作为右值:
p=arr;//指向arr首元素的首地址
如果p++;
则指向//arr第二个元素的首地址
如果int *q=arr+5;
在同一个数组中指针减法输出的是他们之间的元素个数
int ret=q-p;
ret的结果是5
printf打印数组的值注意点:
实例1

    int arr[5] = {1, 3, 5, 7, 9};    int *p = arr;    printf("*p++ = %d.\n", *p++);//先打印1在往后移一位    //分析:先赋值后p自加        printf("*(p++) = %d.\n", *(p++));//从右往左看p++还是一个整体所以是先打印3在往后移动一位    //3

实例2

int arr[5] = {1, 3, 5, 7, 9};int *p = arr;printf("*++p = %d.\n", *++p);    //3 先赋值printf("(*p)++ = %d *p = %d.\n", (*p)++, *p);//从左往右先打印*p,在打印第二个*p在移动一位结果为3  3printf("*p = %d (*p)++ = %d.\n", *p, (*p)++);   //结果为 3 4

指针与malloc函数的使用
示例:

//malloc申请的空间,默认是有最小分配的char *p = (char *)malloc(20)//    if (NULL == p)    {        printf("error.\n");    }    memset(p, 020);    //释放    free(p);

typedef理解
typedef是重命名的关键字,他不是发明新类型,而是给类型起了一个新外号

例子:typedef char * tpchar;//给char *类型起了一个名字

定义一个变量:类型名+变量名
对于函数(例如void func(void))他的类型名可以理解成void *(void)
则可以有定义

typedef void (*p_func)(void)

如果用p_func p;//定义一个变量p

p=func;//绑定

p();//的效果和func();一样

对于上述内容:
函数是一个地址,也就可以理解成指针,所以函数也可以用类型这个理解方法
函数相当于一个指向自己地址的指针变量,所以
void (*p)(void) = &func;也正确
&func和func内容相同但意义不同

二维数组与指针
如定义一个二维数组
int arr[2][3]={1,2,3,4,5,6};
对于其可以理解成
{arr[0],arr[1]}
arr[0][3]={1,2,3}
arr[1][3]={4,5,6}
如果
int (*p)[3] ;
p=arr;
如果p++;则指向了arr[1]即{4,5,6}的首地址
如果*p++;则指向了元素‘2’的首地址
如果**p则得到第一个元素
//arr &arr[0] &arr[0][0]
//arr代表数组首元素首地址(&arr[0])
//&arr[0]代表第一维数组的首元素首地址
//&arr[0][0]代表数组的第二维数组是首元素首地址

原创粉丝点击