[c语言]指针初阶

指针初阶

  • 指针和指针类型

    1. 指针是什么 ?

      在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

    2. 这里我们就明白:
      在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
      那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
      总结.
      指针是用来存放地址的,地址是唯一标示一块地址空间的。指针的大小在32位平台是4个字节,在64位平台是8个字节

    3. 指针类型的意义:

      1.指针类型决定了:指针的解引用权限有多大

      2.指针类型决定了:指针走一步,能走多长(步长)

      int main(){
          //指针类型决定解引用权限
          int a = 0x11223344;	//16进制,共4*8=32个bite位
          int b = 0x11223344;	//
          int* pa = a;	//用int类型指针指向a ,int类型:4字节
          char* pb = b;	//用char类型指针指向b ,char类型,1字节
          pa = 0;	//a=00 00 00 00
          pb = 0;	//b=00 22 33 44
          //因为char类型的引用权限只有1字节,因此只能修改b中的一个字节位
          
          //指针类型决定指针步长
          int arr[10] = {0};
          int* p1 = arr;
          char* p2 = arr;
          printf("%p\n",p1);	
          printf("%p\n",p2);	
          //p1与p2相同都是输出arr的首元地址
          printf("%p\n",p1+1);
          printf("%p\n",p2+1);
          //p1与p2不同,因为int会往前走4个字节,而char只往前走1个字节
          return 0;
      }
      
  • 野指针

    野指针:指针的位置是不可变的

    1. 产生野指针的原因:

      指针未初始化

      指针越界访问

      指针指向的空间已经被释放

    2. 如何让避免野指针

      指针初始化(习惯),不知道指针指向多少可以默认指向null

      int *p = NULL;

  • 指针运算

    1. 指针± 整数

      	int a = 10;
      	int* p = &a;
      	printf("%d",*p+1);
      
    2. 指针- 指针

      指针- 指针表示:指针之间的元素个数;

      前提是:两个指针必须指向同一块空间

      int main() {
      	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
      	printf("%d",&arr[9]-&arr[0]);
      	return 0;
      }
      
    3. 指针关系运算

      int main(){
      	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
      	int* p = &arr;
      	for (; p < &arr[10];) {		//指针的关系运算
      		printf("%d",*p);
      		p++;
      	}
      	return 0;
      }
      
  • 指针和数组

    //指针和数组
    int main() {
    	int arr[5] = { 1,2,3,4,5 };
    	int* p = &arr;
        //数组名:数组首元素地址,因此p==arr,都是标志arr[0]的地址
        //因此:arr[2]==*(arr+2)==*(p+2)==*(2+p)==*(2+arr)==2[arr]==p[2]==2[p]
    	printf("%d\n", arr[2]);
    	printf("%d\n", *(arr+2));
    	printf("%d\n", *(p+2));
    	printf("%d\n", *(2+p));
    	printf("%d\n", *(2+arr));
    	printf("%d\n", 2[arr]);
    	printf("%d\n", p[2]);
    	printf("%d\n", 2[p]);
    	return 0;
    }
    
  • 二级指针

    int main() {
    	int a = 10;
    	int* pa = &a;
    	int* * ppa = &pa;//其中第二个*表示:ppa是指针;第一个*表示ppa指向的对象是int*类型
    	printf("%d\n",a);
    	printf("%d\n", *pa);
    	printf("%d\n", **ppa);
    	return 0;
    }
    

在这里插入图片描述

  • 指针数组

    用于存放指针的数组

    int * paar[5];//整形指针数组
    char* pch[5];//字符指针数组
    

    暂时先知道有这个东西就行

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值