0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言-一维指针定义与使用

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-08-14 10:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 前言

指针在很多书本上都是当做重点来介绍,作为C语言的灵魂,项目里指针无处不在。

比如: 指针作为函数形参的时候,可以间接修改源地址里的数据,也就相当于解决了函数return一次只能返回一个值的问题。

指针在嵌入式单片机里使用最直观,可以直接通过指针访问寄存器地址,对寄存器进行配置;计算机的CPU、外设硬件都是依靠地址操作的。

2. 指针变量如何定义?

#include 
#include 
int main()
{
	char *p1;  //定义一个char类型的指针变量
	int *p2;   //定义一个int类型的指针变量
	//int类型的指针变量: 存放地址数据。
	
	int data=123; //定义一个int类型的变量
	//int类型的变量: 存储整数数据。
	return 0;
}

3. 指针如何使用?

#include 
#include 
int main()
{
	// &data  取地址    a&b 按位与   a&&b  并且
	// int *p 定义一个int类型的指针
	// *p  取出指针指向空间中的数据--取数据
	// a*b a和b乘法
	
	int *p; //指针变量本身就是存放地址的
	int data=123; 
	//p=data; //错误:data本身只是一个变量标识符,不是地址
    p=&data;  //将data的地址赋值给指针p
	
	printf("*p=%d\n",*p); //取出指针p指向空间中的数据
	*p=666; //给指针指向的空间赋值
	printf("data=%d\n",data);
	return 0;
}

4. 什么是野指针?

野指针就是本身没有合法地址空间—非法指针。

野指针会导致的常见错误:段错误。

下面代码就会导致段错误:

#include 
#include 
int main()
{
	int *p;//指针只能存放地址
	*p=123;
	printf("*p=%d\n",*p);
	return 0;
}

5. 指针本身占的空间是多少?

所有指针类型都占4个字节空间。和类型没有关系。

#include 
#include 
int main()
{
	int *int_p;//指针只能存放地址
	int int_a;
	char *char_p;//指针只能存放地址
	char char_a;
	float *float_p;//指针只能存放地址
	float float_a;
	double *double_p;//指针只能存放地址
	double double_a;
	printf("int_a=%d\n",sizeof(int_a));//4
	printf("int_p=%d\n",sizeof(int_p));//4
	
	printf("char_a=%d\n",sizeof(char_a));
	printf("char_p=%d\n",sizeof(char_p));
	
	printf("float_a=%d\n",sizeof(float_a));
	printf("float_p=%d\n",sizeof(float_p));
	
	printf("double_a=%d\n",sizeof(double_a));
	printf("double_p=%d\n",sizeof(double_p));
	return 0;
}

6. 指针访问数组成员

6.1 访问一维数组成员的方式有哪些?

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int *p;
	p=a;
	printf("下标4的值:%d\n",a[4]); //5
	printf("下标4的值:%d\n",*(a+4)); //5
	printf("下标4的值:%d\n",*(p+4)); //5
	return 0;
}

6.2 指针访问一维数据常用的操作方式:字符串

#include 
#include 
int main()
{
	char str[]="1234567890";
	char *p=str;
	int len=0;
	printf("p=%s,str=%s\n",p,str);
	//计算字符串的长度
	while(*p++!='\0')
	{
		len++;
	}
	printf("len=%d\n",len);
	return 0;
}

6.3 指针自增和自减?++和—运算符

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int *p=a;
	printf("%d\n",*p);   //1
	printf("%d\n",*p++); //1
	printf("%d\n",*p);   //2
	printf("%d\n",*(p+3));//5
	printf("%d\n",*p);//2
	printf("%d\n",*(++p));//3
	printf("%d\n",*p);//3
	printf("%d\n",*p--);//3
	printf("%d\n",*p);//2
	return 0;
}

6.4 指针自增自减偏移字节是多少?

与指针本身的类型有关系。

#include 
#include 
int main()
{
	/*
	int a[]={1,2,3,4,5,6,7,8,9,0};
	int *p=a;
	printf("偏移之前的地址:p=%#x\n",p);
	*(p++);
	printf("%d\n",*p);   //2
	printf("偏移之后的地址:p=%#x\n",p);
	*/
	char a[]={1,2,3,4,5,6,7,8,9,0};
	char *p=a;
	printf("偏移之前的地址:p=%#x\n",p);
	*(p++);
	printf("%d\n",*p);   //2
	printf("偏移之后的地址:p=%#x\n",p);
	return 0;
}

6.5 数组本身可以当做指针使用吗?

不可以

指针特点: 自增、自减、可以改变指向。

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5}; //*(a+3)
	int b[]={11,12,13,14,15};
	//下面3行代码是错误的
	a--;
	a++;
	a=b;
	return 0;
}

6.6 指针可以当做数组使用吗?

可以

数组特点: 可以通过下标访问数组成员。

#include 
#include 
int main()
{
	int a[]={1,2,3,4,5};
	int *p=a;
	printf("%d\n",a[0]);
	printf("%d\n",p[0]); //*p
	return 0;
}

7. 数组指针

数组指针可以指向一个一维数组,行指针也叫一维数组指针。

定义语法:char (*p)[5]; 该指针指向一个二维数组里的一个一维数组地址,一维数组的成员是5个字节。

二维数组的定义方法:char a[10][5];

#include 
#include 
int main()
{
	int (*p)[5]; //定义一个一维数组指针---行指针
	int a[2][5]=
	{
		{1,2,3,4,5},
		{6,7,8,9,10}
	};
	p=a; //将a地址给p指针
	printf("%d\n",p[0][2]);
	
	p++; //加一个一维数组的大小
	printf("%d\n",p[0][2]);
	return 0;
}

8. 指针数组

指针数组: 表示该数组成员可以存放指针。

指针数组定义语法:int *p[5];表示定义一个int数组,该数组的类型可以存放5个int类型的指针变量(地址)。

#include 
#include 
int main()
{
	int a,b,c;
	int *p[3]; //一次定义3个int类型的指针变量
	//存放地址
	p[0]=&a;
	p[1]=&b;
	p[2]=&c;
	//对空间赋值
	*p[0]=123;
	*p[1]=456;
	*p[2]=789;
	//取出数据
	printf("%d\n",*p[0]);
	printf("%d\n",*p[1]);
	printf("%d\n",*p[2]);
	return 0;
}

#include 
#include 
int main()
{
	char a[][100]={"小明","小白","小李"};
	char *p[]={"小明","小白","小李"};
	
	printf("%s\n",a[0]);
	printf("%s\n",p[0]);
	return 0;
}

9. 指针类型常见的初始化值:NULL

#include 
#include 
int main()
{
	char *p=NULL; // (void*)0 == NULL
	printf("%#x\n",p);
	if(p!=NULL)
	{
		//判断指针是否可以使用
	}
	return 0;
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20143

    浏览量

    328644
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144553
  • 指针
    +关注

    关注

    1

    文章

    484

    浏览量

    71669
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言中指针定义

    节中,我们利用了个小知识来介绍了指针,在上面这个例子中,小明和小丽手中的这个杯子就好比我们C
    发表于 08-15 16:24 2169次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中指针</b>的<b class='flag-5'>定义</b>

    大话指针变量的定义

    b),返回值为int,要指向其他类型的函数,可以照此方法类推,同样我想把二数组名存到指针变量,我们知道二数组名是个数组指针,所以我们
    发表于 09-24 01:01

    文彻底搞懂C语言指针

    相似,二数组名是个指向整个二数组首地址的指针,但是它的类型不再是int类型指针,而是int类型数组
    发表于 07-22 14:48

    C51语言指针、结构、联合和枚举

     指针C51语言的精华也是难点。本章主要介绍指针的概念、定义指针的方法,介绍指向
    发表于 06-12 23:47 112次下载

    C语言入门教程-指针

    指针C语言中,指针被广泛使用。所以要想完整地掌握C语言,您需要对
    发表于 07-29 11:30 798次阅读

    C语言入门教程-指向结构体的指针

    指向结构体的指针C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。创建结构体指针
    发表于 07-29 12:04 3328次阅读

    C语言指针电子教程

    本资料是份不错的关于C语言指针的电子教程,希望对大家有所帮助... 指针简介 指针
    发表于 07-30 16:00 77次下载

    C语言指针函数和函数指针详细介绍

    C语言指针函数和函数指针详细介绍。。。。。。。
    发表于 03-04 15:27 5次下载

    c语言函数指针定义,指针函数和函数指针的区别

     往往,我们提到指针函数和函数指针的时候,就有很多人弄不懂。下面就由小编详细为大家介绍C语言中函数指针
    发表于 11-16 15:18 3973次阅读

    C语言的精髓——指针详解

    C语言的精髓——指针详解
    发表于 11-30 14:43 17次下载

    C语言教程之指针定义及特点(上篇)

    int (*p)[n];p为指向含n个元素的数组的指针变量 int f();f为带回整型函数值的函数 int *p();p为带回指针
    发表于 05-22 07:28 2796次阅读

    10分钟掌握C语言指针

    说到指针,估计还是有很多小伙伴都还是云里雾里的,有点知其然,而不知其所以然。但是,不得不说,学了指针C语言才能算是入门了。指针
    的头像 发表于 11-04 16:37 2096次阅读

    C语言中的野指针是怎么来的?

    、什么是野指针指针C语言的灵魂,同时也是很容易让人犯错的重难点,用错了指针将是
    的头像 发表于 06-01 16:43 2950次阅读

    c语言指针用法简单举例 C51的指针概述

    指针C语言个特殊的变量,它存储的数值被解释成为内存的个地址。 指针
    的头像 发表于 04-22 18:04 5548次阅读

    C语言进阶】C语言指针的高阶用法

    C语言进阶】C语言指针的高阶用法
    的头像 发表于 08-31 13:24 3171次阅读