C语言基础之指针入门

一.指针简介

1.什么是指针

指针全称为指针变量,是用来存放内存地址的变量,地址是唯一标示一块地址空间的。
用&(取地址操作符) 取出变量的地址存放在一个变量中,这个变量即为指针变量。

2.指针的大小

指针是用来存放地址的,故指针的大小与内存的地址有关,故:

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

二.指针的类型

各位小伙伴都知道,变量是有类型的,那指针有没有类型呢?
答案是肯定的,与变量的定义类似,指针的定义是:type + * + 变量名,现将常用的指针的定义列在下面

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

其实:
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址,依此类推。

指针类型的意义

1.指针的类型决定了指针向前或向后走一步走的距离(单位是字节)。

#include <stdio.h>
//演示实例
int main()
{
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;
 
 printf("%pn", &n);
 printf("%pn", pc);
 printf("%pn", pc+1);
 printf("%pn", pi);
 printf("%pn", pi+1);
 return  0;
}

运行截图如下:
在这里插入图片描述
由图可知,char类型的指针加1时只向后移动一个字节,而int类型的指针向后移动了四个字节,具体移动的距离有指针的类型决定。

2.指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

#include <stdio.h>
int main()
{
 int n = 0x11223344;
 char *pc = (char *)&n;
 int *pi = &n;
 *pc = 0;   //重点在调试的过程中观察内存的变化。
 *pi = 0;   //重点在调试的过程中观察内存的变化。
 return 0;
}

调试截图如下:

最开始时n在二进制中的存储:
在这里插入图片描述
指针pc对n进行操作之后的存储:
在这里插入图片描述
指针pi对n进行操作之后的存储:
在这里插入图片描述
很显然,对于char* 类型的指针pc对n进行操作时,只能操作一个字节,而int* 类型的指针pi能操作4个字节

三.指针的运算

指针的运算分为以下三种:

  1. 指针± 整数
  2. 指针-指针
  3. 指针的关系运算

指针± 整数

指针加(减)整数表示该指针向后(前)移动相应的位置。

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	int* q = &arr[9];
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *q --);
	}
}

上述代码中p+i指向的是arr[i]的地址,q–表示该指针向后移动数组arr中一个元素的地址(即四个字节)。

指针-指针

指针其实是可以和指针相减的,但前提是两个指针必须指向同一块空间,否则指针相减就没有意义。
指针减指针得到的是两个指针之间元素的个数

int my_strlen(char* s)
{
	char* start = s;
	while (*s != '')
	{
		s++;
	}
	return s - start;
}

int main()
{
	int len = my_strlen("abc");
	printf("%dn", len1);
}

如上代码,用来计算字符串的长度。

指针的关系运算

指针的关系运算是指指向数组元素的指针与指向数组相邻内存地址的指针相比较,以达到遍历数组的目的。
标准规定
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

四.数组和指针

1.数组名表示的是数组首元素的地址。

#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%pn", arr);
    printf("%pn", &arr[0]);
    return 0;
}

运行截图:
在这里插入图片描述
两种特殊情况除外:

  1. 当数组名是操作符sizeof的操作对象时表示的是整个数组的大小。
  2. 对数组进行取地址操作时得到的是数组的地址,如果将它和数组首元素地址以及数组名打印出来,会发现它们的值是一样的。但如果对&arr进行+1等操作,就会发现跳过的不是一个元素的大小,而是一个数组的大小。
int main()
{
	int arr[10] = { 0 };
	printf("%pn", arr);
	printf("%pn", &arr);
	printf("%pn", arr + 1);
	printf("%pn", &arr + 1);
	return 0;
}

在这里插入图片描述

2.数组和指针本身是两种事物,但是可以通过一定的方法将二者联系起来,可以构成数组指针指针数组

数组指针

数组指针,从语文语法结构上说,数组是个名词性定语,重点还是指针,所以数组指针仍然是一个指针,是指向数组中元素的指针。

指针数组

指针数组,指针是定于,重点是数组,所以指针数组是一个数组,是用来存放指针的数组。

最后,感谢各位大佬百忙之中抽时间看我的博客,有意见可以评论区交流哦。

谢谢各位大佬!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>