指针的初阶

1. 指针的概念

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

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a = 100;
	//在内存中开辟的一块空间
	int* p = &a;
	//对变量a,取出它的地址,可以使用&操作符
	//将a的地址存放在p变量中,p就是一个之指针变量。
	system("pause");
	return 0;
}
  1. 对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或者0),那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001

11111111 11111111 11111111 11111111

每个地址标识一个字节,那我们就可以给 (2^32Byte == 2^32/1024KB == 2^32 /1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空闲进行编址。

  1. 对于64位的机器,假设有64根地址线,那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
,,,,,,,
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

每个地址标识一个字节,那我们就可以给 (2^64Byte == 2^64/1024KB == 2^64 /1024/1024MB==2^64/1024/1024/1024GB == 8GB) 8G的空闲进行编址。

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针 变量的大小就应该是4个字节。 在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

综上总结:指针的大小在32位平台是4个字节,在64位平台是8个字节

2. 指针和指针类型

char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL; 
double *pd = NULL;

总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。

3.指针运算

  • 指针± 整数
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		*(arr + i) = 0;
	}
  • 指针—指针(得到的是指针与指针之间的元素个数,应该同类型相减
    int—int,char—char
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	printf("%d\n", (arr + 9) - arr);
	//结果输出为9

4.二级指针

  • 指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 所以就有了 二级指针 。
	int a = 10;
	int* pa = &a;
	int** ppa = &pa;
	//a的地址存放在pa中
	//pa的地址存放在ppa中
	//pa是一级指针,ppa是二级指针

5.指针与数组(名)

  • 数组名表示的是数组首元素的地址
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	//arr=00F3FB30
   // &arr[0]=00F3FB30
  • 还可以用指针来访问数组中每一个元素的地址
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int* p = arr;
	int size = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < size; i++)
	{
		printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i);
	}
	输出为:
	    //&arr[0] = 008FFABC <= == = > p + 0 = 008FFABC
		//& arr[1] = 008FFAC0 <= == = > p + 1 = 008FFAC0
		//& arr[2] = 008FFAC4 <= == = > p + 2 = 008FFAC4
		//& arr[3] = 008FFAC8 <= == = > p + 3 = 008FFAC8
		//& arr[4] = 008FFACC <= == = > p + 4 = 008FFACC
		//& arr[5] = 008FFAD0 <= == = > p + 5 = 008FFAD0
		//& arr[6] = 008FFAD4 <= == = > p + 6 = 008FFAD4
		//& arr[7] = 008FFAD8 <= == = > p + 7 = 008FFAD8
		//& arr[8] = 008FFADC <= == = > p + 8 = 008FFADC
     	//& arr[9] = 008FFAE0 <= == = > p + 9 = 008FFAE0

6.指针数组

  • 指针数组是数组,是存放指针的数组。

    举个例子:

  int arr1[7];
  char arr2[7];
  int* arr3[5];  

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值