首页 > 系统相关 >Linux下的C语言编程(指针)

Linux下的C语言编程(指针)

时间:2024-06-07 22:30:04浏览次数:15  
标签:pchar 编程 Linux C语言 偏移 printf sizeof pint 指针

目录

1 一级指针

1.1 定义

1.2 指针的内存大小

1.3 指针的偏移

1.3.1 加法偏移

1.3.2 减法偏移

2 二级指针

2.1 定义

2.2 如何理解二级指针

3 三级指针

3.1 定义

4 数组和指针的关系

4.1 一维数组与指针的关系

4.1.1 数组名的性质

4.1.2 数组名与指针的地址偏移

4.2 二维数组与指针的关系

4.2.1 数组名的性质

4.2.2 数组名与指针的关系


一提到指针大多数人可能会头大,在学习指针之前可能都有一个疑问“指针是什么呢?”,其实说白了指针就是内存地址,而指针类型的变量就是保存内存地址的变量。常说的指针类型的变量在64位的操作系统上占8个字节(32位操作系统上占4个字节)

1 一级指针

1.1 定义

如下图①所示,我们在定义一级指针的时,如果是*和int(变量类型)在一起时表示的是数据类型,即整型指针类型。*和p在一起时是运算符

 tips: ②中的p表示保存的是a的地址,*p表示的是a的地址对应的值

1.2 指针的内存大小

通过实验来证明:

#include <stdio.h>

int main ()
{
	char a = 1;
	short b = 1;
	int c = 1;
	long d = 1;
	float e = 1;
	double f = 1;

	char *pchar = &a;
	short *pshort = &b;
	int *pint = &c;
	long *plong = &d;
	float *pfloat = &e;
	double *pdouble = &f;

	printf("sizeof(pchar)=%ld\n", sizeof(pchar));
	printf("sizeof(pshort)=%ld\n", sizeof(pshort));
	printf("sizeof(pint)=%ld\n", sizeof(pint));
	printf("sizeof(plong)=%ld\n", sizeof(plong));
	printf("sizeof(pfloat)=%ld\n", sizeof(pfloat));
	printf("sizeof(pdouble)=%ld\n", sizeof(pdouble));
	return 0;
}

运行结果:

通过上面的实验可知指针变量占8个字节的大小(我的是64位的操作系统)

1.3 指针的偏移

1.3.1 加法偏移

指针的偏移反映为地址的变化,加法偏移地址会向下的地址偏移,通过实验来证明:

#include <stdio.h>

int main()
{
	char a = 10;
	char *pchar = &a;

	int b = 20;
	int *pint = &b;

	printf("&pchar = %p\n", pchar);
	printf("&pchar+1 = %p\n", pchar+1);
	printf("&pchar+2 = %p\n", pchar+2);
	printf("&pchar+3 = %p\n", pchar+3);
	printf("&pchar+4 = %p\n", pchar+4);
	
	printf("&pint = %p\n", pint);
	printf("&pint+1 = %p\n", pint+1);
	printf("&pint+2 = %p\n", pint+2);
	printf("&pint+3 = %p\n", pint+3);
	printf("&pint+4 = %p\n", pint+4);
	return 0;
}

运行结果:

由实验可知,pa+1表示地址偏移1个字节,具体偏移字节的大小与指针的数据类型相关,如char类型是1个字节,而int类型是4个字节

1.3.2 减法偏移<

标签:pchar,编程,Linux,C语言,偏移,printf,sizeof,pint,指针
From: https://blog.csdn.net/weixin_65384924/article/details/139514129

相关文章

  • C语言:(动态内存管理)
    目录动态内存有什么用呢malloc函数开辟失败示范free函数calloc函数realloc函数当然realooc也可以开辟空间常⻅的动态内存的错误 对NULL指针的解引⽤操作对动态内存开辟的空间越界访问对⾮动态开辟内存使⽤free释放使⽤free释放⼀块动态开辟内存的⼀部分对同一......
  • C语言入门分析
    C语言是一门面向过程的高级语言,既有接近底层的特性,也有高级的语法。所谓C生万物,C语言自1972年诞生以来,一直都被业界所认可。而其它的一些曾经流行的编程语言如:COBOL、Pascal、Fortran等已经被基本不被使用了。但C语言却历久弥新,到现在为止,C语言在编程界的地位还是如此重要。那......
  • 物理机安装Linux操作系统
    1.物理机安装Linux环境这里以Ubuntu系统为例,Centos系统同理,windows同理1.1下载系统镜像官网下载速度慢的话可以直接百度各大学的镜像下载网站去下载,如下以清华镜像网站为例:https://mirrors.tuna.tsinghua.edu.cn/1.2下载工具ventoyVentoy官网:https://www.ven......
  • linux内存管理(一)物理内存的组织和内存分配
    从这一篇开始记录以下我看有关内存管理的内核代码的笔记.内容很长,很多是我自己的理解,请谨慎观看.伙伴系统的工作的基础是物理页的组织,组织结构有小到大依次为page->zone->node。下面从源码里看看各个结构是如何组织的。typedefstructpglist_data{structzonenode_z......
  • Java为什么会成为现在主流的编程语言
    JDK动态代理 是Java标准库提供的一种实现动态代理的方式。具体来说,它允许在运行时动态地创建对象,并将方法调用重定向到代理对象中的处理程序(InvocationHandler)。其核心原理是通过反射机制,在运行时生成一个实现了被代理对象接口的匿名类,并通过该匿名类来创建代理对象。这个匿名......
  • 第十二天C语言自学笔记
    C语言多文件编程原理 一、C语言多个.c的编译原理分工协作--分离编译器怎么分离.c的编译对每个.c单独进行编译生成目标文件对所有的目标文件进行链接组合 注:每个.c只关心语法是否正确,所有不认识的标签,都在编译时提前声明出来 输出.o文件:gcc-c-omain.omain.c......
  • linux安装mysql8并配置主从
    服务器10.213.3.68DBmaser10.213.3.69DBslave都安装mysql8安装包,解压mysql-8.0.35-linux-glibc2.17-x86_64.tar.xz[root@DB-mastermysql8]#lsbindocsincludelibLICENSEmanREADMEsharesupport-files优化过的配置文件[mysqld]server-id=1log-bin=mys......
  • fs.1.10 ON rockylinux8 docker镜像制作
    概述freeswitch是一款简单好用的VOIP开源软交换平台。rockylinuxdocker上编译安装fs1.10版本的流程记录。环境dockerengine:Version24.0.6rockylinuxdocker:8freeswitch:v1.10.7手动模式rockylinux准备dockerhub拉取rockylinux镜像。sudodockerpullrockylinux:8......
  • Linux 获取系统开机/启动时间
    Linux下如何查看系统启动时间和运行时间以及安装时间-努力哥-博客园(cnblogs.com)cat/proc/uptime输出:5113396.94575949.85第一数字即是系统已运行的时间5113396.94秒,运用系统工具date即可算出系统启动时间代码:[root@localhost~]#date-d"$(awk-F.'{print......
  • 操作系统发展历史与Linux
    操作系统发展历史与Linux随着计算机技术的迅猛发展,操作系统作为计算机系统的核心软件,经历了从单一到多样、从封闭到开放的演变过程。从最初的批处理系统,到分时操作系统的兴起,再到个人计算机操作系统的崛起,最后到Linux的诞生和广泛应用,每一步都见证了操作系统领域的重大变革。早......