首页 > 其他分享 >C基础-初始指针

C基础-初始指针

时间:2023-10-06 19:32:37浏览次数:26  
标签:10 arr int 基础 char printf 初始 指针

何为指针?

可以通过指针找到以其为地址的内存单元。指针就是变量,只不过存放在指针的值被当做地址处理

指针和指针类型

根据下图我们可知不同指针类型的存储大小是一样的,并根据计算机位数决定的,64位一般是8个字节

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

	return 0;
}

C基础-初始指针_赋值


指针类型的意义

1.决定访问内存大小

int a = 0x11223344;
int* pa = &a;
*pa = 0;

根据下图可知当&a以int* 类型解引用的时候该指针所指的值改变了4个字节

C基础-初始指针_赋值_02

C基础-初始指针_野指针_03

int a = 0x11223344;
char* pc = &a;
*pc = 0;

根据下图可知当&a以char*类型解引用的时候该指针所指的值改变了一个字节

C基础-初始指针_数组_04

C基础-初始指针_数组_05

故我们得到指针类型的作用在于在解引用的时候访问内存的大小

2.决定偏移量

根据下图,我们得到,当int*指针时,指针加1向后偏移4个字节;当char*时,指针加1向后偏移1个字节,因此指针类型还觉得指针+1所偏移的量

int a = 0x11223344;
	int* pa = &a;
	char* pc = &a;

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

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

C基础-初始指针_数组_06

野指针

1.指针未初始化

int* p;
*p = 20;
printf("%d\n", *p);

2.指针越界访问

当循环访问超过数组范围,使指针指向值不明确

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;

	for (i = 0; i < 12; i++)
	{
		p++;
	}
}

3.指针指向了空间释放

int* test()
	{
		int a = 10;
		return &a;
	}
int main()
	{
		int* p = test();
		*p = 20;
	}

指针的运算

1.指针+-整数

	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;

	for (i = 0; i < sz; i+=2)	//每隔2打印数组的值
	{
		printf("%d ", *p);
		p += 2;
	}

	int arr[5] = { 0 };
	int* vp = arr;
	for (vp = &arr[0]; vp < &arr[5];)	对arr数组每个元素赋值1
	{
		printf("%d ", *vp++ = 1);
	}

2.指针+-指针

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//算的是两个地址之间的元素个数
printf("%d ", &arr[9] - &arr[0]);
//输出为9

int my_strlen(char arr[]) //利用指针相减计算字符串长度
{
  char* str = &arr[0];
  char*end = &arr[0];
  
  while(*end != '\0')
  {
    end++;
  }
  return end - star;
}


标签:10,arr,int,基础,char,printf,初始,指针
From: https://blog.51cto.com/u_16284214/7727008

相关文章

  • 2023-2024-1 20231428《计算机基础与程序设计》第一周学习总结
           这个作业属于哪个课程2023-2024-1-计算机基础与程序设计            作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01          这个作业的目标快速阅读教材,初步了解所学内容 ......
  • 十四天学会C++之第四天(面向对象编程基础)
    类和对象是什么?在C++中,类是一种用户定义的数据类型,它可以包含数据成员(也就是属性)和成员函数(也就是方法)。类是一种模板或蓝图,用于创建具体的对象。对象是类的实例,它是根据类的定义创建的,可以用来表示现实世界中的各种事物。对象具有类定义的属性和行为。面向对象编程思想面向对象编......
  • 2023-2024-1 学号20231315《计算机基础与程序设计》第二周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习计算机科学概论第1章和《C语言程序设计》第1......
  • 网络编程基础
    网络编程InetAddress类表示IP对象的一个类publicstaticvoidmain(String[]args)throwsUnknownHostException{//获取本机的ip对象//InetAddressip=InetAddress.getLocalHost();//获取域名//System.out.println(ip.getHostName());//获取真......
  • 数据库备份和Shell基础测试及AWK(运维)
    第一题:简述一下如何用mysql命令进行备份和恢复,请以test库为例,创建一个备份,并再用此备份恢复备份备份步骤:备份test库:使用mysqldump命令备份test库,并将备份写入一个.sql文件中。命令示例:mysqldump-u用户名-p密码test>backup.sql恢复的步骤:恢复备份:使用mysql命令将备份文件中的......
  • 【HTML专栏1】语法规范、基础结构标签
    本文属于HTML/CSS专栏文章,适合WEB前端开发入门学习,详细介绍HTML/CSS如果使用,如果对你有所帮助请一键三连支持,对博主系列文章感兴趣点击下方专栏了解详细。博客主页:DuckBro博客主页系列专栏:HTML/CSS专栏关注博主,后期持续更新系列文章如果有错误感谢大家批评指出,一定及时修改感谢......
  • 深入探究数据结构与算法:构建强大编程基础
    文章目录1.为什么学习数据结构与算法?1.1提高编程技能1.2解决复杂问题1.3面试准备1.4提高代码效率2.学习资源2.1经典教材2.2在线学习平台2.3学习编程社区3.数据结构与算法的实际应用3.1排序算法3.2图算法3.3字符串匹配算法4.结论......
  • CSS 基础 5 - CSS 选择器
    基础#id{}ID选择器.class{}类选择器tag{}标签选择器,tag可以是h1,p,div,span,img,nav,footer...*{}通用选择器,选择所有元素,可以和其他复杂选择器组合<divclass="class1class2"id="my-id"></div>注:每个元素可以有多个类,例如上面的HTML,在CSS中......
  • 初始化 Angular 懒加载模块:使用MODULE_INITIALIZER的高级技巧
    Angular是一个强大的前端开发框架,它提供了各种机制来优化应用程序的性能和可维护性。在本文中,我们将深入探讨Angular中的MODULE_INITIALIZER,这是一个用于初始化懒加载模块的强大工具。我们将详细介绍MODULE_INITIALIZER的用法以及它在Angular中的作用。什么是懒加载模块?懒加载模......
  • 基础算法--字符串
    \(KMP\)\(KMP\)算法(Knuth-Morris-Pratt算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。基本概念\(1\)、s[]是模式串,即比较长的字符串。\(2\)、p[]是模板串,即比较短的字符串。(这样可能不严谨。。。)\(3\)、“非平凡前缀”:指除了最后一个字符以外,一个字符串的全......