C语言基础 指针

指针

 

内存中最小的存储单元 : 字节 ,每一个字节在内存中都有一个编号, 这编号就是指针

 

       指针作用 : 有了指针就可以访问它所指向的存储空间

       *作用 : 1.在定义指针变量的时候 , 它就类型说明符, 它说明定义的这个变量是一个指针变量

       2.如果不是在定义指针的时候 , 它是一个操作符 , 用在指针变量的前面是访问指针所指向的存储空间

       &作用 : 取地址符 , 取出变量地址

 

       指针 : 内存地址

       有了指针就有了打开内存的钥匙 , 就可以操作这一块内存

 

       指针变量 : 存放内存地址的变量

 

       定义指针 : 指针所指向的数据类型  *指针变量名称;

         

 

       在定义变量时候 , *是一个类型说明符 ,说明定义这个变量是指针变量

 

       在不是定义的变量时候,*是一个操作符 , 访问(读,写)指针所指向那块存储空间

 

       指针使用场景:通过被调函数 , 修改主调函数中某个变量的值

 

       注意点:

       1 . 只有定义没有初始化指针里面是一个垃圾值 , 这时候我们操作这个指针为野指针

       2 . 如果操作一个野指针

              2.1程序奔溃

              2.2访问不该访问存储 , 操作潜在逻辑错误

       3 . 不可以使用整形常量赋值一个指针变量

              因为内存是操作系统分配我们的 , 不是我们随便取的

       4 . 什么类型的指针 , 指向什么类型变量

       5 . 多个指针可以指向同一变量

      

       指针使用场景:

              1.在被调函数中 , 通过形参来改变主调函数中某个变的值

              2指针可以返回多个值

 

       指针的初始化:

       int num= 10;   //先定义变量再进行初始化

       int *p;    //定义指针变量p

       p =  &num //p 指向 num

       *p = 20;

       三级指针 : 指向耳机指针的指针

       int***ppp = &pp;

       ***ppp =40;

 

       定义指针变量的同时进行初始

       int num2= 20;

       int *p2= &num2;

       *p2 =40;

       printf(“%d,%d\n”,num2,*p2);

 

       // 

       int *p3= 10000; // 此处是错误的

 

       int num= 10;

       int *p =#

       // pp 就是一个二级指针

       int  **pp = &p;

 

 

       1.变量的地址是变量所占存储空间的首地址

       2.指针变量仅仅可以存储一个地址编号, 如果没有类型 ,当通过指针就不知道要访问多少个字节存储空间.

       3.指针区分类型是为了在通过指针访问它所指向存储空间的时候, 能够正确的访问.

       4.如果通过一个小的char类型的指针操作一个int变量 , 如果这个值的二进制数据超过8位(1个字节), 那么就造成数据错误

       5.如果通过一个int 类型的指针操作一个char变量 , 那么就会修改了你不该修改的内存 ,造成程序逻辑错误

 

       多级指针:

              二级指针 : 指向以及指针的指针

              int nums = 10;

              int*p = #

              int**p = &p;

              **p= 20;

 

       指针变量 

 

       指针运算:

       指针 + 整形数 == 指针变量中值+ sizeof(其所指向数据类型)

       指针 - 整形数 == 指针变量中值-  sizeof(其指向的数据类型)

       pointer1- pointer2 = (pointer1中值 - pointer中值) / sizeof(指向的数据类型)

 

       pointer+ num : 把指针向后移动 num 个它所指向的数据类型单元

       pointer- num : 把指针向前移动 num 个它所指向的数据类型单元

 

       赋值运算

       =

       += 必须是一个整形数

       -= 必须是一个整形数

       比较运算

       ==

       !=

      

 

       >

       <

       >=

       <=

       int a=10;

       int *p =&a;

       p = p+1;

 

       关系运算 ( 比较运算 )

       pointer1== pointer2 : pointer1 与 pointer 指向同一地址

       pointer1> pointer2 : pointer1 在 pointer2前面

       pointer1< pointer2 : pointer1 在 pointer2后面

 

 

       intnums[5] = {1,2,3,4,5};

       int *pointer1 = num;

       int *pointer2 = &num[4];

       size_tsize = pointer2 - pointer1;

       printf(“%lu\n”,size);

 

       指针与数组(一维数组)

       数组像一个指针 : 访问数组中元素 

       intnums[] = {1,2,3,4,5};

       int  *p = nums;

 

       printf(“%d,%d,%d,%d,%d\n”,nums[1],p[1],*(nums+ 1),*(p +1), *(++p),1[nums]);

 

       数组不是一个指针

       1.sizeof(array)!= sizeof(pointer) : 当一个数组赋值一个指针变量的时候, 那么数组中有些信息就丢失了 ,比如数组长度 ,这种现象指针信息遗失

       2.指针的指向是可以改变的 , 数组的指向是不可以改变的

       3.array== &array 数组名就是数组地址,pointer != &pointer : 指针所指向的地址不是指针本身地址

 

       指针与二维数组

       1.指针数组 : 元素为指针的数组

       指针类型 : 它所指向的数据类型

       2.数组指针 : 指针数组的指针

       指向一维数组的指针 :  int  (*pointer)[元素个数]

       指向一维数组的指针它和二维数组对应

 

       intnums[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

       pointer= nums;

 

       pointer++;

       pointer+ 1;

       pointer[1]+ 1;

 

       相同点 对应地址都是一样的

       不通点 : 指针类型是不同

       nums + 1= nums + sizeof(num[0])

       nums[0]+ = nums +sizeof(int)

 

       for (inti =0; i < sizeof(nums) / sizeof(int);i++){

       printf(“%d:,p[i]);

       }

 

      

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值