首页 > 其他分享 >指针

指针

时间:2023-07-13 22:13:25浏览次数:29  
标签:p1 return int printf include 指针

指针

在我的理解中,指针是用来存放地址的。指针也有大小,对于不同类型的指针char,short,int,,,double,它们的指针大小都是8个字节,对于64位机器是这样的,而对于32位机器它们的指针大小都为4个字节。我的是64位操作系统:

#include <stdio.h>

int main()
{
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(long*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));

	return 0;
}

image
显而易见都是8个字节大小的指针。

#include <stdio.h>

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

分析以上代码:我们定义并初始化了一个int类型的整型变量a,它的值是10;那么此时内存就会给a分配一个int类型大小的空间用来存放a变量,那么也就是说在内存中有一个内存地址专门来指向a。我们想拿到变量a的地址就要用一个操作符,叫做取地址符&,通过&a我们就拿到了a的内存地址,当然我们拿到了a的内存地址就要那个变量把它存起来,所以我们用变量p把它存起来,而p的类型是一个指针*,而int表示p所指向的对象的类型是int类型。我们把p的值打印出来:
image
我们通常用16进制来存储地址。



那我们有了指针变量p如何改变变量a里的值呢,此时我们也要用到一个操作符叫做解引用符**p就等价于a,所以我们加入*p = 20;代码后原来a的值就会被重新赋值为20。

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	*p = 20;
	printf("%d\n", a);

	return 0;
}

image

const

在定义变量前加const表示该变量是一个伪常量,你不能直接修改例如:

#include <stdio.h>

int main()
{
	const int a = 10;
	a = 20;
	printf("%d\n", a);

	return 0;
}

image
编译不通过。但你可以通过指针来间接去修改它的值:

#include <stdio.h>

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

	return 0;
}

image
对于代码int* p = &a;,加入的const位置不同那么它的作用也不同,例如const int* p = &a;或int const * p = &a表示我们不能修改指针变量p所指向的那块内存空间里存的值。而int* const p = %a;,表示我们不能修改指针变量p存储的内存地址的值

多重指针

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	int*** ppp=&pp;

	return 0;
}

里面最多有一个三重指针,你每取一次地址就会加一重指针。

#include <stdio.h>

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	int*** ppp=&pp;

	printf("%d\n", ***ppp==a);
	printf("%d\n", **pp==a);
	printf("%d\n", *p==a);

	printf("%d\n",*ppp==&p);
	printf("%d\n",*pp==&a);

	return 0;
}

image
printf中的等式两边都是等价的。

指针的加减

#include <stdio.h>

int main()
{
	int arr[2] = {0};
	int* p1 = &arr[0];
	int* p2 = &arr[1];

	printf("p2-p1=%zd\n", p2-p1);

	return 0;
}

指针减指针的结果是它们之间差的元素个数
image
而指针加1的结果就要根据指针的类型

#include <stdio.h>

int main()
{
	int arr[2] = {0};
	int* p1 = &arr[0];
	int* p2 = &arr[1];

	printf("p1=%p\n", p1);
	printf("p1+1=%p\n", p1+1);

	return 0;
}

image
显而易见它们之间差了4个字节也就是一个int类型的大小。而对于char类型加1,它们之间相差为1也就是一个char类型的大小。

#include <stdio.h>

int main()
{
	char arr[6] = "hello";
	char* p1 = &arr[0];
	char* p2 = &arr[1];

	printf("p1=%p\n", p1);
	printf("p1+1=%p\n", p1+1);

	return 0;
}

image

标签:p1,return,int,printf,include,指针
From: https://www.cnblogs.com/bcc0729/p/17552303.html

相关文章

  • Java空指针异常优雅处理的方式
    1原因如下:由于Java开发过程中一不注意就会造成空指针异常,但是如果要避免这些空指针异常我们就可能需要写如下啰嗦有无聊的语句:if(test!=null&&test.size()>0){..............}为了避免写这些无聊的语句和避免NPE错误,我们可以用如下用法进行替代。......
  • 现代C++(Modern C++)基本用法实践:五、智能指针(Smart Pointers)
    概述c++效率较高的一个原因是我们可以自己定制策略手动申请和释放内存,当然,也伴随着开发效率降低和内存泄漏的风险。为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,有三种:std::unique_ptr是一种独占所有权的智能指针,它不允许多个指针指向同一个对......
  • 双指针和双向搜索
    双指针 也常叫\(two-pointers\),是一种简单又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处。 顾名思义,就是同时使用两个指针,在序列、链表结构上指向的是特定位置,在树、图上指向的是节点,通过同向移动,或者相向移动来维护、统计信息。例......
  • 算法小菜鸟成长记录Day01-二分查找和双重指针
    二分查找和双重指针今天是代码随想录刷题的第一天,刚开始刷的时候昏昏欲睡,其中用时3h主要实现以下几个部分二分查找:其中二分查找中其收获最大部分就在于对左开右闭区间的理解,如果都是闭区间也就是【a,b】,那么在while中的条件就为while(left<=right),确保其中是拥有元素也就是......
  • 野指针与空指针
    一、野指针与空指针要注意(1)野指针野指针是一个指向未知(undefine)的,不确定地方的指针."未知的,不确定的",指向的地方可能存在,可能不存在.可能可以访问,也可能不可以访问.对野指针的访问,会有后果?可能可以访问,可能不可以访问(导致非法的内存访问).非法的内存......
  • 数据结构与算法 #18 下跳棋,极富想象力的同向双指针模拟
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和[BaguTreePro]知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭将基于Java/Kotlin语言,为你分享常......
  • 指针函数与函数指针
    1.指针函数先看下面的函数声明,注意,此函数有返回值,返回值为int*,即返回值是指针类型的。1.int*f(inta,intb);上面的函数声明又可以写成如下形式:int*f(inta,intb);让指针标志*与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,f是函数名,返回值类型是一个i......
  • 106.你什么情况用指针当参数,什么时候用引用,为什么?
    106.你什么情况用指针当参数,什么时候用引用,为什么?1.使用引用参数的主要原因有两个1.程序员能修改调用函数中的数据对象2.通过传递引用而不是整个数据–对象,可以提高程序的运行速度2.一般的原则1.对于使用引用的值而不做修改的函数:(1)如果数据对象很小,如内置数据类型或者小型结......
  • 74.指针加减计算要注意什么?
    74.指针加减计算要注意什么?指针加减本质是对其所指地址的移动,移动的步长跟指针的类型是有关系的,因此在涉及到指针加减运算需要十分小心,加多或者减多都会导致指针指向一块未知的内存地址,如果再进行操作就会很危险。举个例子:#include<iostream>usingnamespacestd;intmain(......
  • 80.继承机制中对象之间如何转换?指针和引用之间如何转换?
    80.继承机制中对象之间如何转换?指针和引用之间如何转换?1.向上类型转换将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。2.向下类型转换将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不......