iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中的初阶指针详解
  • 778
分享到

C语言中的初阶指针详解

2024-04-02 19:04:59 778人浏览 安东尼
摘要

目录1.指针是什么2.指针和指针类型3.野指针3.1野指针成因3.2如何规避野指针4.指针的运算4.1指针±整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针

1.指针是什么

​ 初学者都有一个疑问,那就是指针是什么?简单的说,就是通过它能找到以它为地址的内存单元。

地址指向了一个确定的内存空间,所以地址形象的被称为指针。


int main()
{
	int a = 10;
	int* pa = &a;
    return 0;
}
//pa是用来存放地址(指针),所以pa是指针变量。

总结:指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

​ 地址是唯一标识一块空间的。

​ 指针的大小在32位平台是4个字节,在64位平台是8个字节。

2.指针和指针类型

​ 我们知道变量有不同的类型(整型、浮点型、字符型等),其实指针也是有不同类型的。

​ 指针类型的意义1:
指针类型决定了指针解引用操作的时候,一次访问几个字节(访问内存的大小)
char* 指针解引用访问1个字节
int* 指针解引用访问四个字节


int main()
{
	char* pc = &a;
	*pc = 0;
	return 0;
}

​ 指针类型的意义2:

指针类型决定了,指针±整数的时候的步长(指针±整数的时候,跳过几个字节)

int* 指针+1 跳过四个字节

char* 指针+1 跳过一个字节


int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	printf("%p\n", pa);
	printf("%p\n", pc);
	printf("%p\n", pa+1);
	printf("%p\n", pc+1);
	return 0;
}

3.野指针

​ 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。

3.1野指针成因

1.指针未初始化


int main()
{
    int* p;//局部变量指针未初始化,默认为随机值
    *p = 20;//通过p中存的随机值作为地址,找到一个空间,这个空间不属于我们当前的程序
    //就造成了非法访问,p就是野指针
    return 0;
}

2.指针越界访问


int main()
{
    int arr[10] = 0;
    int i = 0;
    int* p = arr;
    for(i =0; i <= 10; i++)
    {
        *p = i;
        p++;//当指针指向的范围超出数组arr的范围时,p就是野指针
    }
    return 0;
}

3.指针指向的空间释放


int* test()
{
    int a = 10;
    return &a;
}
int main()
{
    int* p = test();
    printf("%d\n",*p);
    return 0;
}

3.2如何规避野指针

1.指针初始化

2.小心指针越界

3.指针指向空间释放即使置NULL

4.避免返回局部变量的地址

5.指针使用之前检查有效性


int main()
{
    int a = 10;
    int* p = &a;//明确地初始化,确定指向
    int* p2 = NULL;//不知道一个指针当前应该指向哪里时,可以初始化为NULL
    return 0;
}

4.指针的运算

4.1指针±整数


#define N_VALUES 5
float values[N_VALUES];
float* vp;
for(vp = &values[0]; vp < &values[N_VALUES];)
{
    *vp++ = 0;
}

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int* p = &arr[9];
    printf("%p\n",p);
    printf("%p\n",p-2);
    return 0;
}

4.2指针-指针

​ 指针-指针 得到的数字的绝对值是指针和指针之间元素的个数


int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	printf("%d\n", &arr[9] - &arr[0]);
	printf("%d\n", &arr[0] - &arr[9]);
	return 0;
}

指针-指针 的前提是两个指针指向同一块区域


int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    char ch[5] = {0};
    printf("%d\n",&arr[9] - &ch[0]);//err
    return 0;
}

应用 求字符串长度


int my_strlen(char* s)
{
	int count = 0;
	char* start = s;
	while(*s!='\0')
	{
		s++;
	}
	return s - start;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

4.3指针的关系运算


#define N_VALUES 5
float values[N_VALUES];
float *vp;
for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;
}

上述程序也可以写成这样


for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这么写,因为标准并不保证它可行。

标准规定

​ 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

5.指针和数组

数组 - 是一块连续的空间,放的是相同类型的元素

数组大小和元素类型,元素个数有关系

指针(变量) - 是一个变量,放地址

指针变量的大小 是4(32bit)/8(64bit)个byte

数组名确实是首元素地址

但是有两个例外:

1.sizeof(数组名) - 这里的数组名不是首元素的地址,是表示整个数组的,这里计算的是整个数组的大小,单位还是字节。

2.&数组名 - 这里的数组名不是首元素的地址,是表示整个数组的,拿到的是整个数组的地址


int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr);
	printf("%d\n", sz);
	return 0;
}

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0;i < sz;i++)
	{
		*(p + i) = i;
	}
	for (i = 0;i < sz;i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

6.二级指针

​ 我们都知道,指针变量是变量,是变量就有地址,那么指针变量的地址存放在哪里呢?

这就是我们要了解的二级指针。


int main()
{
    int a = 10;
    int* p = &a;
    int** pp = &p;//pp就是二级指针
    **pp = 20;
    printf("%d\n", a);//a = 20
    return 0;
}

7.指针数组

​ 从名字上来看,大家觉得指针数组是指针还是数组?

答案是数组,是存放指针的数组。

整型数组 - 存放整型的数组就是整型数组

字符数组 - 存放字符的数组就是字符数组

指针数组 - 存放指针的数组就是指针数组

int* 整型指针的数组

char* 字符指针的数组


int main()
{
	int arr[10];
	char ch[5];
	int* parr[5];
	char* pc[6];
	return 0;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int* parr[3] = { &a,&b,&c };
	for (int i = 0;i < 3;i++)
	{
		printf("%d\n", *(parr[i]));
	}
	return 0;
}

​ 总结

以上就是我们初始C语言指针的全部内容了,后续我还会更新C语言指针的进阶版本,希望大家能够对C语言的指针能够有更深层次的了解。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C语言中的初阶指针详解

本文链接: https://www.lsjlt.com/news/137543.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中的初阶指针详解
    目录1.指针是什么2.指针和指针类型3.野指针3.1野指针成因3.2如何规避野指针4.指针的运算4.1指针±整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针...
    99+
    2022-11-12
  • C语言中的指针 初阶
    目录1.指针是什么2.指针和指针类型3.野指针3.1野指针成因3.2如何规避野指针4.指针的运算4.1指针±整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针...
    99+
    2022-11-12
  • 【C语言初阶】指针篇—下
    目录 4. 指针运算4.1 指针+-整数4.2 指针-指针4.3 指针的关系运算 5. 指针和数组6. 二级指针7. 指针数组 C语言初阶—指针上 点击跳转 4. 指针运算 指针...
    99+
    2023-09-01
    c语言 算法 开发语言 指针
  • C语言中的指针新手初阶指南
    目录1.指针是什么2.指针和指针类型3.野指针3.1野指针成因3.2如何规避野指针4.指针的运算4.1指针±整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针...
    99+
    2022-11-12
  • C语言 指针数组进阶详解
    目录指针与数组中的sizeof与strlensizeofstrlen数组名1、一维数组整型数组字符数组指针数组2、二维数组指针笔试题 笔试题1笔试题2笔试题3笔试题4笔试题...
    99+
    2022-11-13
  • 零基础详解C语言指针进阶
    目录前言1.字符指针例题 12.指针数组例题 23.数组指针3.1数组指针的定义3.2 &数组名与数组名3.3 数组指针的使用4.数组与指针在函数里的传参4.1 一维数组的传...
    99+
    2022-11-13
  • C语言指针详解
    目录前言:复杂类型说明一、细说指针1.指针的类型2.指针所指向的类型3.指针的值----或者叫指针所指向的内存区或地址4 指针本身所占据的内存区二、指针的算术运算三、运算符&...
    99+
    2022-11-12
  • C语言指针详解之野指针
    目录指针是什么?怎么表示?什么是指针变量?指针类型又是什么?指针类型存在的意义野指针是什么?野指针产生的原因一、 指针未初始化二、 指针越界访问如何避免野指针(野狗)的出现呢?指针运...
    99+
    2022-11-12
  • C语言之初识指针
    指针是什么? 那到底什么是指针呢,其实指针和之前学习的变量基本相似,不过变量里面放的是一些值,而指针里面放的是它所指的地方的地址。在声明一个变量是,计算机就会为该变量预留一个位置,而...
    99+
    2022-11-12
  • C语言进阶:指针的进阶(1)
    目录指针进阶字符指针字符指针的作用字符指针的特点指针数组指针数组的定义指针数组的使用总结指针进阶 我们在初阶时就已经接触过指针,了解了指针的相关内容,有: 指针定义:指针变量,用于...
    99+
    2022-11-12
  • C语言进阶:指针的进阶(2)
    目录数组指针数组指针的定义&数组名和数组名数组指针的使用反面用例正面用例Example类型辨别方法总结数组指针 由前面的例子,不难得出,数组指针是指向数组的指针,是指针而非...
    99+
    2022-11-12
  • C语言进阶:指针的进阶(3)
    目录数组传参和指针传参一维数组传参二维数组传参一级指针传参二级指针传参总结数组传参和指针传参 实践之中不免会碰到数组和指针作函数参数而如何设计形参的问题。 一维数组传参 一维数...
    99+
    2022-11-12
  • C语言进阶:指针的进阶(4)
    目录函数指针函数指针的定义函数指针的类型函数指针的使用Example总结函数指针 函数指针的定义 整型指针存放整型的地址;数组指针存放数组的地址;那么类比可得,函数指针存放函数的地...
    99+
    2022-11-12
  • C语言进阶:指针的进阶(5)
    目录函数指针数组函数指针数组的定义函数指针数组的使用转移表回调函数指向函数指针数组的指针总结函数指针数组 //整型数组 - 存放整型变量 int arr[10]; //字符数组 ...
    99+
    2022-11-12
  • C语言进阶教程之函数指针详解
    目录一、函数指针1.概念1.2函数指针的使用方法1.3练习巩固1.4小结一下二、阅读两段有趣的代码1.( *(void( *)( ))0 )( )2.void (* signal(i...
    99+
    2022-11-13
  • C语言 指针的初始化赋值案例详解
    目录1、指针的初始化2、指针的赋值3、指针常量4、指针初始化补充5、void *型指针6、指向指针的指针1、指针的初始化 指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够...
    99+
    2022-11-12
  • 详解C语言初阶基础
    目录1.什么是c语言2.初始化:3.变量和常量4.作用域与生命周期简单阐述:作用域:生命周期(存在与消失):作用域与生命周期的区别作用域:生命周期:5.    &...
    99+
    2022-11-12
  • C语言的空类型指针,空指针,野指针详解
    目录空类型指针-void*空指针-NULL野指针造成野指针的原因1.指针未初始化2.指针越界访问3.指针指向的空间已经释放避免野指针总结空类型指针-void* void是空类型,vo...
    99+
    2022-11-12
  • C语言函数指针详解
    目录Introduction函数指针 Function PointersExercise 1:qsort中的函数指针Exercise 2:总结Introduction 上一个lab的...
    99+
    2022-11-12
  • C语言指针基础详解
    目录1.1:概述1.1.1:内存1.1.2:内存1.1.3:指针和指针变量1.2:指针基础知识1.2.1:指针变量的定义和使用1.2.2:通过指针间接修改变量的值1.2.3:指针的大...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作