首页 > 其他分享 >指针学习(1)(1)

指针学习(1)(1)

时间:2024-08-11 16:23:41浏览次数:7  
标签:const 变量 int 学习 地址 pa 指针

目录

1.指针变量和地址

1.1取地址操作符(&)

1.2指针变量

1.3拆解指针 

1.4解引用操作符(*)

1.5指针类型的大小

1.6void*指针

 2.const修饰指针

2.1const修饰变量

2.2const修饰指针变量

2.2.1const在*左边

2.2.2const在*右边 

 2.2.3const在*两侧

 结论:


 

1.指针变量和地址

1.1取地址操作符(&)

&  :取出相应变量的所储存的地址。

#include <stdio.h>
int main()
{
	int a = 10;
	&a;//取出a的地址
	printf("%p\n", &a);
	return 0;
}

1.2指针变量

我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x006FFD70,这个数值有时候也是需要 存储起来,方便后期再使用,所以我们把这样的地址值存放在指针变量里面

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//取出a的地址并存储到指针变量pa中

	return 0;
}

 存放在指针变量中的值都会理解为地址。(内存单元的编号 == 地址 == 指针

1.3拆解指针 

如果需要存放在指针变量里,什么类型的变量就需要储存在相对于的指针类型里面

int a = 10;
int* pa = &a;//取出a的地址并存储到指针变量pa中

在int* pa= &a;中,*是在说明pa是指针变量 ,int是在说明pa指向的是整型(int) 类型的对象。

同样如果是字符类型的变量,就应该放在字符指针变量里面,例:

char ch = 'w';
char* pc = &ch;

1.4解引用操作符(*)

*  :通过地址(指针)找到地址(指针) 指向的对象

#include <stdio.h>
int main()
{
	int a = 100;
	int* pa = &a;
	*pa = 0;// *pa 的意思就是通过pa中存放的地址,找到指向的空间,
//*pa其实就是a变量了;所以*pa = 0,这个操作符是把a改成了0.
	return 0;
}

​

1.5指针类型的大小

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(double*));
	printf("%zd\n", sizeof(float*));
	return 0;
}

即:

32位平台下(X86)地址是32个bit位,指针变量大小是4个字节

64位平台下(X64)地址是64个bit位,指针变量大小是8个字节

注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

1.6void*指针

void* 指针,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进行指针的+-整数和解引用的运算。

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	return 0;
}

将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了一个警告,是因为类型不兼容。而使用void*类型就不会有这样的问题

#include<stdio.h>
int main()
{
	int a = 10;
	char b = 'w';
	void* pa = &a;
	void* pb = &b;
	pb = pb + 1;//指针加减整数
	*pa = 100;//解引用运算
}

由此可知:void* 类型的指针可以接收不同类型的地址,但是无法直接进行指针运算。

 2.const修饰指针

在C语言中,const关键字用于声明常量,它表示变量在程序运行期间其值不可更改。当你将一个变量声明为const,编译器会确保对该变量的任何尝试修改操作都会产生错误。常量可以是简单数据类型的(如int const x = 5;),也可以是复杂表达式的(如const int arr[10] = {1, 2, 3};),还可以是指针(如const int* p = &n;  int *const p = &n;  int const * const p = &n;)

2.1const修饰变量

#include <stdio.h>
int main()
{
 int m = 0;
 m = 20;//m是可以修改的
 const int n = 0;
 n = 20;//n是不能被修改的
 return 0;
}
​
#include <stdio.h>
int main()
{
 int m = 0;
 m = 20;//m是可以修改的
 const int n = 0;
 n = 20;//n具有了常属性,是不能被修改的,但仍然是变量(常变量)
//但是在c++中,const修饰的就是常数
 return 0;
}

​

上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就行修改,就不符合语法规则,就报错,致使没法直接修改n。

但是如果绕过n,从n的地址下手,就可以改变了

#include <stdio.h>
int main()
{
 const int n = 0;
 printf("n = %d\n", n);
 int*p = &n;//从地址下手
 *p = 20;
 printf("n = %d\n", n);
 return 0;
}

2.2const修饰指针变量

2.2.1const在*左边

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int const* p = &a;
	p = &b;//正确
	//*p = 100;//错误
	//const在修饰变量时,放在*的左边,限制的是指针指向的内容,不能通过指针来改变指向的内容
	//但是可以改变指针本身的值(指针的指向)
	return 0;
}

2.2.2const在*右边 

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int * const p = &a;
	//p = &b;//错误
	*p = 100;//正确
	//const在修饰指针变量时,放在*的右边,限制的是指针变量本身,指针变量不能再指向其他内容了
	//但是可以通过指针变量,改变指针指向的内容
	return 0;
}

 2.2.3const在*两侧

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int const * const p = &a;
	//p = &b;//错误
	//*p = 100;//错误
	//const在修饰指针变量时,同时放在*的两侧,限制的是指针变量本身和指针指向的内容
	return 0;
}

 结论:

const修饰指针变量的时候

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。

• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。

标签:const,变量,int,学习,地址,pa,指针
From: https://blog.csdn.net/2401_85711575/article/details/141067811

相关文章

  • STM32学习记录(九):RTC
    RTC框图实时时钟(Real-timeclock:RTC)是一个独立的计时器。RTC提供一组连续运行的计数器,可以与合适的软件一起使用,以提供时钟日历功能。可以写入计数器值以设置系统的当前时间/日期。可以选择以下三种作为RTC时钟源:HSE时钟进行128分频LSE振荡器时钟LSI振荡器时钟有关时......
  • 程序员的学习方法
    很多程序员想提升自己,但不知道应该怎么做才能事半功倍。这篇文章给你答案。首先你得知道你的动机是什么?动机从总体上分为以下三类:A.为了生存。比如:想要通过面试,找到程序员的工作。想要通过面试,进入更高级别的岗位,然后有更高的收入。B.为了梦想。比如:工作中老碰到问题,对......
  • 一文搞定Ubuntu服务器深度学习环境配置(超详细包括换源)
    1.首先配置zshZsh(Zshell)是一种功能强大的命令行解释器,较Bash(BourneAgainShell)有以下优势:强大的自动补全:Zsh不仅支持命令和文件的自动补全,还支持参数、路径以及Git命令的补全,使操作更高效。灵活的定制:Zsh允许用户灵活自定义提示符,显示如时间、Git状态等信息。使用O......
  • 【Ansible 学习之旅】Ansible核心工具介绍
    系列文章Ansible介绍和架构Ansible安装和入门配置控制机器和受控机器Inventory文件介绍目录系列文章利用ansible实现管理的主要方式ansible-docansibleansible-playbookansible-vaultansible-consoleansible-galaxy利用ansible实现管理的主要方式Ad-Hoc即......
  • 高等数学学习笔记(一)
    高等数学学习笔记最近入门了高等数学,特此记录一下学习到的重点。Chapter1实数与实数集这部分内容高中已经接触过很多了,仅补充一些未曾了解过的。1.完备性实数集不仅对加减乘除开方运算封闭,并且对于极限运算也封闭,这个性质被称为“完备性”。实数中的集合通常称为数集。2.......
  • 基于django+vue古诗词学习平台【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在数字化时代,尽管信息获取方式日新月异,但中华古诗词作为中华民族的文化瑰宝,其传承与学习却面临着新的挑战与机遇。传统的学习模式往往受限......
  • pytorch深度学习实践(刘二大人)课后作业——Titanic数据集分析预测
    一、课后作业构造分类器对Titanic数据集进行预测1.数据集预处理(1)数据集下载与分析下载地址:https://www.kaggle.com/c/titanic/data导入必要的包,并查看训练集、测试集前五行数据importtorchimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimp......
  • AI大模型开发——3.深度学习基础(2)
    8.损失函数        损失函数( Loss Functions), 也称为代价函数, 是用于评估模型预测值与真实值之间差异的函数。在神经网络训练过程中,损失函数用于指导模型参数的更新方向和幅度, 以使模型预测的结果尽可能接近真实值。        常见的损失函数有以下两个......
  • AI大模型开发——2.深度学习基础(1)
        学习大模型开发之前,我们需要有足够的储备知识,类似于基础的python语法相信大家也都是十分熟悉了。所以笔者也是考虑了几天决定先给大家补充一些深度学习知识。    首先问大家一个问题,学习大模型之前为什么要先学习深度学习知识呢?    首先,深度学习......
  • 李宏毅-机器学习-笔记-P1
    P1机器学习基本概念(一)一、机器学习是什么?        MachineLearning≈Lookingforfunction、函数太过复杂,让机器来找比如:SpeechRecognition(语音识别):声音信号通过函数转化为文字,输入到输出      ImageRecognition(图像识别)、PlayingGo二、着重关......