C语言 - 初阶指针

初阶指针

指针是什么?

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

指针是个存放内存单元的地址

#include<iostream>
int main() {
int a = 10;//内存中开辟一块空间
	int* p = &a;//创建指针,取出它的地址,这里使用的是&
	//将a的地址存放在p变量中p就是一个指针变量
	return 0;
}

总结:指针就是变量用来存放地址的变量在32位中指针的大小是4个字节64位中大小是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 类型变量的地址

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

不同类型的指针访问的字节数目不同,决定了指针向前后者向后走一大步或者一小步

总结:

指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节

野指针

​ 概念:指针指向的位置是不可知的不明确的。

​ 原因:

  • 1.指针没有初始化
#include<stdio.h>
int main()
{
	int *p;//指针没有初始化,默认为随机值。
    *p=20;
    return 0;
}
  • 2.指针越界空间
#include<stdio.h>
int main()
{
    itn arr[10]={0};
    int *p=&arr;
    for(int i=0;i<=11;i++)
    {
        *(p++)=i;
}
    return 0;
}

避免野指针的方法

  1. 初始化指针
  2. 小心指针越界
  3. 指针指向空间释放即使置NULL
  4. 指针使用之前检查有效性

指针的运算

指针加减整数

#include<stdio.h>
int main() {
int arr[10];//内存中开辟一块空间
	int* p = &arr[0];//创建指针,取出它的地址,这里使用的是&
	//将a的地址存放在p变量中p就是一个指针变量
	for (p = &arr[0]; p <= &arr[10];)
	{
		p++;
	}
	return 0;
}

指针减指针

int  myfun(char *s)
{
		char *p=s;
		if(p!='\n')
		{
		p++;
		}
		return p-s;
}
  • 注意:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

指针和数组之间的关系

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

在这里插入图片描述

由此可见数组名字和数组元素的第一个的地址是相同的,所以数组名存放的就是数组的首元素地址

int *p=arr;//就是首元素的地址

#include<stdio.h>
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int* p = arr;
	printf("%p\n", &arr);
	printf("%p\n", &arr[0]);
	int leng = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < leng; i++)
	{
		printf("arr[%d] + %p  +p+%d + %p \n", i, &arr[i], i, p + i);
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPTm6PM9-1677168404972)(image/image-20230223152752702.png)]

所以p+i就是数组arr[i]的下标地址这样玩吗就可以通过指针来访问数组

通过指针来访问数组

#include<stdio.h>
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int* p = arr;
	printf("%p\n", &arr);
	printf("%p\n", &arr[0]);
	int leng = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < leng; i++)
	{
		printf("%d\n", *(p + i));
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值