指针

学习提速专享!AI工具全家桶免费用 限时购周边加赠Coding Plan Lite,解锁20+主流AI工具,写代码、查资料快人一步! 阅读详情

什么叫指针

指针与指针变量:一个变量的地址就称之为该变量的“指针”,而“指针变量”则是用来存放这个地址的变量。
地址:内存中存储单元的位置编号就是地址。
存储单元:大小固定,1Byte(字节)。
而在32位系统中我们最多可以有(2^32)个编号,即从0~0xffffffff
64位系统之最多有(2^64)个编号,即0~0xffffffffffffffff
如果定义如下变量与指针:

int i;
int* p=&i;

那么,p是一个int型变量,它里面存放的就是i的地址,而p则代表以p中所存储的地址作为起始地址,以p的基类型所占的字节数作为偏移量,访问此空间。
p的起始地址就是i的地址,基类型为int,所以从起始地址开始访问四个字节的存储空间,就得到了i的值。

指针变量作为函数参数

我们都知道,一个函数只能有一个返回值,那么当我们想返回多个值时就可以使用指针变量作为函数参数。
在被掉函数中,通过对形参指针的间接访问,可以改变主调函数中实参指针所指向的变量的值。
比如swap函数:
以前的做法是

void swap(int a[])
{
if(a[0]>a[1])
	{
		int t;
		t=a[0];
		a[0]=a[1];
		a[1]=t;
	}
}

可以通过数组来返回所要的值.
使用指针:

void swap(int* a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}

通过指针就可以返回所要的值。
但要注意,不能写成这样子:

void swap(int* a,int *b)
{
	int* t;
	*t=*a;
	*a=*b;
	*b=*t;
}

上面代码中所定义的int* t;t并没有初始化,所以t中存放的就是一个随机地址,而这个地址系统中并不一定会有,所以这样运行会出错误。

数组与指针

我们都知道指针是经常会和数组放在一起使用,如定义如下指针:
int a[10];
int* p;
p=a;
这就定义了一个指向数组首元素的指针,他存放的就是数组首元素的地址,即a[0]的地址。由C语言规定 p+1就是a[1]的地址,并不是在原来的地址基础上简单的加一,而是由p+(sizeof(p的基类型))*要加的数。
一些数组与指针等价的写法:

int a[10];
int* p=a;

a[i]==*(a+i)==p[i]==*(p+i)
对二维数组来说:

int a[3][4];
int (*p)[4];
p=a;

a[i][j]==*(a[i]+j)==*(*(a+i)+j)==(*(a+i))[j]
int (*p)[4]是定义了一个指针变量p,该指针指向一个长度为4,元素为int的数组。

注:

数组名代表数组首元素地址
(数组名取地址)+1代表跳过整个数组
例如:
int a[3][4];
int (*p)[4],
p=a;
p是一个指针数组,p代表着a[0]的地址,而a[0]是一个包含着四个元素的数组名,
p+1==a[0]+1,即代表跳过整个a[0]数组,跳过四个int型数,即p+1跳过了16个字节。

字符串与指针

char s[]=“hello world !”;
char* p=“hello world !”;
可以写s[3]=‘a’;
不可以写p[3]=‘a’;
因为p是一个指向字符串常量的指针,常量在运行期间不能被改变,而s是一个数组,可以被改变。
如果改写为
char s[]=“hello world !”;
char* p=s;
那么两个就都可以改变,因为p变成了一个指向数组的指针。

一个可以实现链式表达式的字符串复制函数

char* strcopy(char* dest,const char* src)
{
	char* temp=dest;
	if(dest==NULL||src==NULL)
	return ;
	while(*dest++=*src++);
	return temp;
}
int main()
{
	char s[100];
	char s1[]="tom & jerry";
	char *p=NULL;
	p=s1;
	strcopy(s,p);
}
C指针总结 指针概念 内存由很多内存单元组成,这些内存单元用于存放各种类型的数据。 计算机对每个内存单元都进行了编号,编号称为内存地址,地址对应着内存单元在内存中的位置。 指针即内存地址。 使用案例: int a = 100; int* b = &a; b的值为变量a在内存中的地址。 左值和右值 左值:可以放在赋值运算符左边,编译器为其单独分配了一块空间,可以取其地址。 右值:只能放在赋值运算符右边,不能取到自身地址,指数据本身。 左值通常为函数和数据成员的名字,右值通常为没有标识符、不可以取地址的表达式, 阅读详情

相关推荐

指针进阶(三)

大厂笔试指针题的深度剖析

m0_70386582的博客 351

数组指针(指向数组指针

&数组名与数组名 &数组名表示的是取出整个数组的地址,而不是首元素地址,所以它+1步长跳过整个数组 数组名在sizeof单独使用时或者被&数组名时表示的是整个数组,其余都指首元素地址 数组指针的使用: 数组指针顾名思义是指向数组指针数组指针存放的是数组的地址 这里的int(*p)[10] 括号*p的意思是让p先和*号配对确保是个指针,然后去掉*p可以知道指针p变量指向的是一个数组,有10个元素,每个元素是int类型 一般用法是这样的:二维...

qq_54567790的博客 4579

指针数组笔试题解析

为什么数组名单独放在sizeof里是计算整个数组的大小? 只要把数组名认清 知道数组指针是干什么的,它是用来指向一个数组的嘛,对不对?所以你当对这个数组指针进行节用的事儿,其实相当于找到了这个数组,那谁能代表这个数组数组名吧。 看完下面的练习题我们可以很清楚的知道数组名是什么,这是一个非常重要的底层逻辑,只有把这个搞清楚,我们做题的时候才能做的得心应手 sizeof -操作符 - 单位是字节 ,返回类型size_t 求变量所占空间大小 求类型创建的变量所占空间的大小 数组名: 1.sizeof(数组

weixin_58004346的博客 259

C语言之指针总结(2)

前言 本文是对指针数组的一些题的归纳。 一、一维整型数组 #include <stdio.h> int main() { int a[] = {1,2,3,4}; printf("%d\n",sizeof(a));//16 sizeof(a)算的是数组的大小 printf("%d\n",sizeof(a+0));//4/8 sizeof(a+0)不是sizeof(a),所以此处不属于那两种特殊情况,此处的a是数组首元素的地址,地址的大小在32位(大小为

Poem_coder的博客 808

为什么要用指针,什么时候该用指针,什么时候该用指针指针

什么是指针,什么时候要用指针,什么时候要用指针指针指针传参时的注意事项,C语言传递参数的实质,内存分配

Diode的博客 6086

指针指针变量

如果不初始化,p由可能指向任何地方,这种指针称之为野指针,通过野指针去改变指向的不确定的地址的行为是很危险的。对于使用钥匙打开房间A和房间B的效果是一致的,但是内容的交换要比钥匙的交换开销要大得多!①可以进行的算术运算,只有以下几种:px±n,px++/++px,px–/–px,px-py。指针变量pnum的值就是变量num的地址,指针指针变量的区别,就是变量值与变量的区别。所以在定义指针变量的时候,如果暂时没有明确的指向,对其一般初始化为NULL(空指针)对没有指向的指针变量进行操作,是很危险的事情。

cai88453626的博客 7447

深入了解指针指针数组数组指针

大家可能听说过这样一句话,没学过指针就是没学过C语言。指针确实时C语言的一大特色,更是C语言的一大核心。但是指针的学习也没有大家想象的这么难。今天就带大家一起来深入学习一下指针。...

qq_63943454的博客 1600

指针 指针数组 指针数组指针 数组指针 数组指针数组 函数指针 指向函数指针数组指针

指针 指针数组 指针数组指针 数组指针 数组指针数组 函数指针 函数指针数组 指向函数指针数组指针

zhang1308299607的博客 4469

带你认识什么是一级指针、二级指针、三级指针

今天带大家了解一下什么是一级指针、二级指针、三级指针 1、一级指针 一级指针其实就是我们平时常见的普通指针 如: int a = 12; int * b = &a; //一级指针,定义一个指针变量b,将整型变量a的地址(指针)赋值给b 所以首先我们介绍一下什么是指针指针其实是一个内存地址,对于一个内存单元来说,单元的地址即为指针。 而我们平时常用的指针则是指针变量。 指针变量从字面意思上可以看出是存储指针的一种变量类型。 在C语言中,允许用一个变量来存放指针,这种变量称为指针

OMGMac的博客 1万+

【C语言】指针篇(指针数组数组指针,函数指针,一级、二级指针)

本篇包含了指针所有的知识点,包括指针的使用方法,野指针问题,指针类型的判断,一级指针,二级指针指针常量和常量指针指针数组数组指针数组传参和指针传参,函数指针和函数指针数组,以及指向函数指针数组指针,回调函数等等。

炸掉地球的博客 2033

35 多级指针、空指针、野指针、悬挂指针

本文全面探讨了 C/C++ 编程中指针的复杂性和潜在风险,包括指向指针指针(多级指针)的定义与使用、空指针、野指针以及悬挂指针的概念、成因及避免方法。文章通过详细解析和案例演示,帮助读者深入理解这些指针类型及其在实际编程中的应用和注意事项。同时,文章还提供了空指针、野指针、悬挂指针对比总结以及指针使用一览表,为读者提供了一份实用的指针使用指南。

大模型全栈工程师 · Thanks_ks 1402

指针作用、指针指针变量、指针的定义与初始化、指针赋值

指针

csdn_lfy的博客 3697

变量指针指针变量,数组指针指针数组

本文介绍了指针变量作为函数参数的使用方法,重点讲解了通过指针间接修改实参数据的两种方式:交换指针指向和交换指针指向的数据。同时详细阐述了指针变量与数组元素的关系,指出数组名即代表数组首地址,可以用指针变量指向数组元素。文章还系统总结了指针运算的6种常见操作,包括自增、自减、加减n个元素、指针相减和比较等,并强调了指针运算必须在同一数组内进行。最后通过多个案例演示了如何用下标法和指针法遍历数组,展示了指针数组的灵活结合应用。

Dd000110的博客 1322

一文搞懂指针指针指针,悬浮指针,野指针

一文搞懂指针指针指针,悬浮指针,野指针 学习C语言过程中,指针的概念往往是重难点,伴随着时隐时显的*,令人头晕。实际上指针并非如此复杂,掌握最基础概念,有利于我们更深刻的理解指针。 【百科概念】 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 【初识

weixin_45399399的博客 2563

指针数组指针指针数组

目录:1.野指针(1)什么是野指针?(2)野指针的成因a.指针为初始化b.指针访问越界2.指针数组数组指针(1)指针数组(2)数组指针(3)指针数组数组指针+1的区别 1.野指针 (1)什么是野指针? 野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的) (2)野指针的成因 a.指针为初始化 全局变量,静态变量未初始化默认是会初始化的,默认是0 其他变量都不会初始化,默认是随机值 eg: #include<stdio.h> int main() { int* p; //局

HanMeng的博客 2709

C++——指针、无效指针、空指针、void*指针、指向指针指针指针和const、指针数组

本文介绍C++指针的相关内容...

HuoZhiyan 的博客 1160

指针数组指针指针数组,函数指针解析

文章目录前言一、指针是什么?1.1内存和地址1.2 * 运算符和 &运算符1.3创建指针变量1.4int* p的解释二、数组指针指针数组2.1 数组指针指针数组的理解2.2 数组指针指针数组的定义方式2.3 代码分析三、函数指针3.1 函数指针的概念3.2 函数指针的定义3.3 函数指针的使用四、套娃4.1套娃开始4.2 套娃解释4.3 疯狂疯狂套娃 前言 指针可以说是C语言最强大的功能之一,通过指针可以直接访问内存。然而指针也是C语言中非常难掌握的知识点之一。如果可以灵活地使用指针,基本上可以

fyadf的博客 719

数组指针、函数指针指针数组、函数 指针数组指针函数详细总结

数组指针、函数指针指针数组、函数 指针数组指针函数详细总结

wei_Embedded_z的博客 4949
上一篇: 输入一个十六进制数,输出相应的十进制数与给出年、月、日,计算该日是该年的第几天
下一篇: 关于内存对齐的问题
bareheadedman
博客等级 码龄7年 18粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值