[黑马程序员]06[C语言]指针部分笔记总结-01

本文详细介绍了C语言中的指针概念,包括指针的基本原理、指针变量的使用方法、指针与数组的关系以及const对指针的影响。通过实例讲解了如何正确地使用指针,帮助开发者掌握这一核心概念。

------- android培训java培训IOS培训、期待与您交流! ----------


1.    什么是指针


// 指针,即使pointer

   // 我要去三里屯,给一张地图

 

// 指针== 地址

 

// 内存与内存地址(*****)

 

// 内存模型

// 就是一个一个并列的盒子,每一个盒子里值允许存放0或者1(二进制)

// 整合一下,用字节表示一个盒子

// 内存就是一个一个并排的盒子结构(竖着并排)

//

// 每一个内存字节都有一个地址,而且地址从0开始

// 但是我们在使用时不需要考虑

//

// int num = 10;

// 在内存中开辟了一个4字节长度的字节组,将数字10存到里面

// 问题是字节从哪里开始存?不用关

// 只需要关心相邻的地址

 

   // 所谓的指针,就是地址

 

   // 取地址运算符 &

   // 语法:& 变量名

   // :指针

 

 

int main()

{

    int num =10;   

 

    printf("%p\n",&num);

   

    return 0;

    }



2.    指针类型的变量

 

// 指针是地址,就是一段地址

 

// 指针类型的变量,就是储存地址的变量

 

// int num; int变量,就是储存int类型数据的变量

 

// 指针变量,变量的指针,就是变量的地址,&num

 

// 指针式一个地址,但是指针类型的变量是要区分类型的(以后再说,重要度:✨✨✨✨✨)

 

// 如果要定义一个指向int类型的变量的指针储存int类型变量的地址的变量

 

// int *变量

 

// 此时变量"变量名"可以储存地址,但是要求地址是int类型变量的地址(默认是这样)

 

// 注意:指针变量的变量是储存地址的,那么如果给指针类型的变量赋初始值?

 

// 1>定义的同时初始化

// int num = 10;  int *iNump = #

 

// 2>先定义,再初始化

//int num =10; int *p; p =#

 

// 3>先定义,使用的时候再初始化(难点,易错点)

// 如果将来工作,第二个写法是有错的

// 指针在使用的时候最大的特点是可以"随意地"访问内存

// 不给指针变量初始化容易出现错误,对于没有初始化的指针,常常称其为"野指针"

// 定义好指针后用什么进行初始化?

// int *p =12345; // 不允许使用任意的数字

// 规定使用数字0进行初始化int 8p = 0;

// stdio.h中定义了一个宏名NULL 表示的就是空指针

// 一般在初始化的时候建议使用它: int *p = NUlLL;

 

#include <stdio.h>

 

int main()

{

    int num = 10;

   

    int *p = &num;

   

    int *p2;

   

    p2 = &num;

   

    int *p3 = 12345; //非法占用可能有数据的内存地址

   

    int *p4 = 0;

   

    int *p5 = NULL; // 最建议的初始化方式

   

    return 0;

}

 


3.    指针注意点

 

// 1.指针为何要区分类型

 

// 指针类型的变量占8个字节, sizeof验证,32位计算机上是4个字节

 

// why?因为指针里存的就是计算机地址,指针长度就是计算机位数64,8个字节

 

// int *p; *p一次性读取4个字节  long *p2; *p2一次性读取8个字节

 

// 指针类型决定了指针*p一次性读取的数据长度以及数据的读取格式

 

// 变量的类型决定了数据在内存中的储存形式和读取形式

 

// 进行指针运算的时候不一样(后面说)

 

// int类型指针强转成long类型后相当于long指针

 

 

// 2.直接访问,间接访问

 

// 直接访问就是使用变量名进行范文里面的数据

// int num =10;  printf("%d\n",num);

 

// 间接访问就是使用地址,来获取地址所指向的内存中得数据

// 取值运算符语法: *地址(*指针变量)

// int num =10; int *p =&num; printf("%d\n",*p);

// p指向num,而不是*p指向num

// *p == num

 

// 间接访问是访问地址表示的数据,可以获取也可以修改

 

 

// 3.指针的常用用法

 

#include <stdio.h>

 

// 1>.指针可以用于统一的引用变量

// int *p;

// p = &任何int类型的变量;

// *p1 + *p2

 

// 2>.在函数中使用指针变量作为参数,以备函数中对变量的影响在函数结束后保留(利用参数返回)

 

// 3>.使用指针减少函数的参数传递

// void func (参数){...}//指针(地址)的格式比较统一

 

// 4>.引用数组\结构\函数等复杂的数据域代码

 

// *需要掌握的是前4

 

// 5>.使用指针使用动态的内存(不需要太在意,这是C得高级用法,OC会简化)

 

// 6>.使用指针实现高级数据结构(链表\队列\\\\...)

 

 


4.    指针与数组

 

int test()

{

    // 数组就是特殊的指针

   

    // 区别在于,指针是变量,而数组名是个常量*nums++这种用法是不允许的

   

    // 遍历字符串:

   

    char chs[] = "hello iOS";

   

    char *p = chs;

   

    while(*p !='\0')

    {

        printf("%c",*p++);

    }

   

    char chs1[20];

   

    char *p2 = chs1;

   

    while (*p2++ = *p++);

  

    return 0;

}

 

// 数组是占内存空间的,一共需要单位字节数*数组长度

// 而指针固定8个字节(64)

 

// 已经学过的指针概念

//1.指针

//2.指针变量

//3.指向XXX的指针

//

//指针在前面,表达的涵义是值为指针

//指针在后面表达指向的意思

//

//指针数组  数组里元素是指针

//数组指针

//指针函数  函数返回值是指针

//函数指针

 

 


5.    const对指针的影响(技巧知识点)

 

int main()

{

    //const在变量上

    int const num1 = 0;

    const int num2 = 0;

   

    //C语言是一个形式化的语言

    const int *p1; // 这种指针失去了修改指针指向变量值的能力

    int const *p2; // 这种指针失去了修改指针指向变量值的能力

    int *const p3; // 这里const修饰的是p3,那么这种指针指向的变量不可更改,失去了随意指向的能力

    const int *const p4; //修改能力和转向能力都失效

   

    return 0;

}

                                             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值