`
jcs130
  • 浏览: 131697 次
  • 性别: Icon_minigender_1
  • 来自: Ottawa
社区版块
存档分类
最新评论

菜菜如何理解指针~~

 
阅读更多

学C语言的初学者估计是最头疼指针神马的了,大一时候的课程设计搞了半天才弄得稍微明白点~虽然我现在一直在学Java,Java里面并没有指针,习惯了各种对象的“引用”指来指去,这几天数据结构课程设计,重新再看C里面的指针,发现~其实指针并不是那么难~~

 

先来说一下Java,看下面一段代码:

 

public class TestMain {
	public static void main(String[] args) {
		CarInfo c = new CarInfo(123, 123);
		CarInfo a = c;
		c.setCarTime(23);
		System.out.println(c.getCarTime());
		System.out.println(a.getCarTime());

		int e = 100;
		int f = e;
		f++;
		System.out.println(e);
		System.out.println(f);

		String s = "123123";
		String p = s;
		p += "sassadsad";
		System.out.println(s);
		System.out.println(p);
	}
}

PS: CarInfo 是我自己创建的一个类,里面有两个数据

这段示例代码的输出结果为:

 

23

23

100

101

123123

123123sassadsad

 

 

可以看到a和c所指的是一个东西,但是下面的e和f,s和p就不是一样的了。

计算机里面所有运行的程序都是存在内存中的,程序的运行差不多就是内存中不同区域间的数据交换,而语言就是将这个交换的过程用一种比较好理解的方式表现出来~

 

CarInfo c = new CarInfo(123, 123);

 

可以靠理解为,通过new Java开辟了一个新的内存空间用来存储CarInfo对象,然后用c“指向了”这篇内存区域。

CarInfo a = c;

a本来指了c,但是因为c不是内存中的数据,所以a就也指向了c所指的内存。

但是下面的intString在Java中是数据(String比较特殊,暂且这么理解吧),所以“=”就直接赋值了,也就是说先开了一个内存区域,再把值复制到新的内存区域中去。

用一句话总结~那就是对象采用引用传递(指来指去),而数据就采用的是值传递(对于等于号来说)。

 

C语言里面没有对象啊~好吧~C语言里大部份都是值传递~就是把等于号右面的数据复制给等于号左面的。下面看一段示例代码:

#include<stdio.h>
main()
{
 int a,b;
 a=1;
 b=a;
 b++;
 printf("a=%d\n",a);
 printf("b=%d\n",b);
 getch();
}

 可以看到,我修改了b的值,但是a的值不会有改变,如果我想通过修改b来同时也修改a的话,那么就需要用指针了。

C里面定义指针要在变量名前面加一个*

比如说 Car *a;意思就是这是一个指向Car(结构体)的指针;

 

把上面的程序修改一下:

#include<stdio.h>
main()
{
 int a,*b;
 a=1;
 b=&a;
 (*b)++;
 printf("a=%d\n",a);
 printf("b=%d\n",*b);
 getch();
}

 现在输出的结果a就变成2了;

简单说明一下:&是取地址符,&a就是说获取a所指向的内存空间的地址,对~你没看错~是“指向”,可以理解为没有*

就是直接指向内存的数据~下面画一张图或许能更好理解~我们假设a=1的内存地址为12345

1是数据,所以存放在内存里,它所对应的在内存中的地址是12345,*b是个指针,它存储的是地址,通过b=&a,让b把a的地址存了下来,存在了内存地址为12346的内存区域中,同理,要是我们新建一个指向指针的指针**c ,那就把指针b的地址给c 代码就为 c=&b;这样c就把b的地址存储在了内存地址为12347的内存中,以此类推~~

 

总结一下~其实*就是个标志~有*的时候编译器就通过内存的数据找地址,没有的话就直接读内存的数据~&也是这个意思~如果有&就读取这个内存的地址,如果没有就读取这块内存的数据~

 

希望我写的这些能给刚学编程的童鞋一些小帮助,本人也是小菜一个啊~一起加油吧~

 

 

 

 

 

 

 

 

 

 

  • 大小: 16.4 KB
2
0
分享到:
评论

相关推荐

    LabExercises+Templates.zip

    2. **指针与内存管理**:理解指针的概念,如何使用指针进行内存操作,包括动态内存分配和释放。 3. **数组与字符串**:学习数组的使用,包括一维、二维数组,以及字符串在C语言中的处理。 4. **结构体与联合体**:...

    自定义的数据文件结构类

    知道指针和流应该如何使用吗?如果答案是“N” 的话那么就来看看吧^_^。 -*功能:实现数据的压缩保存 读取 添加 删除 修改 和快速定位和查找*- -*功能:可以用来保存你想保存的任何格式的数据,方便做为自己的配置...

    C语言模拟练习.rar

    在C语言的学习过程中,通过实践模拟练习是至关重要的,因为它能帮助我们理解并掌握基本概念、数据类型、控制结构、函数、数组、指针等核心概念。 1. **基本概念**:C语言的基础包括变量、常量、运算符和表达式。...

    C语言-服装销售管理系统 (2).doc

    * 商品信息记录头指针:使用static Products *pProductHead = NULL;定义了一个头指针,用于保存系统商品信息记录。 三、销售记录管理 * 销售记录结构体定义:使用typedef struct关键字定义了一个SellInfoRecord...

    C++primer全书笔记

    这份笔记通过逐步深入的方式,帮助学习者理解并掌握C++的核心概念,包括变量、常量、运算符、数据结构和内存管理。同时,它强调了复习和实践的重要性,通过每天复习前一天的内容,确保学习的连贯性和有效性。对于...

    C语言课程设计.rar

    C语言的指针是其强大的特性之一,它们可以存储内存地址,允许直接访问和修改内存。通过指针,我们可以实现动态内存分配、传递函数参数以及高效地操作数据结构。 四、数组与字符串 数组是一系列相同类型的元素集合,...

    VC/MFC界面图形绘制

    首先,我们需要理解MFC的基本架构。MFC通过封装Windows API,使得开发者可以使用面向对象的方式来构建应用程序。在MFC中,对话框(CDialog)类是用于创建用户交互界面的基础,它可以包含各种控件,如按钮、文本框等...

    C语言课程设计-教室分配管理系统

    - **指针**:利用指针操作结构体,提高代码效率,实现动态内存分配。 - **文件操作**:保存和读取教室和课程数据,通常使用fopen、fwrite、fread等函数。 - **函数**:将代码逻辑划分为多个函数,实现模块化编程,...

    objective-c的总结

    例如,`id`关键字可以用于定义指向任何类型的对象的指针,`NSInvocation`和`NSMethodSignature`类则允许我们在运行时动态地调用方法。 接下来,我们要了解Objective-C中的内存管理。在早期的iOS开发中,主要使用...

    重庆邮电大学802数据结构历年真题.rar

    链表则允许元素在内存中的非连续位置,通过指针链接;栈和队列是两种操作受限的线性结构,栈遵循“后进先出”(LIFO)原则,而队列遵循“先进先出”(FIFO)原则;树是一种层次结构,如二叉树、平衡树(AVL树、红黑...

    职工信息管理系统.zip

    开发者需要熟悉C语言的基本语法、指针操作、结构体定义以及文件I/O等功能。 三、数据结构 数据结构是信息管理系统的基础,这里通常采用链表或数组来存储员工信息。链表可以动态扩展,方便增删操作;数组则便于快速...

    短作业优先调度算法

    1、 设置作业体:作业名,作业的到达时间,服务时间,作业间的链接指针; 2、 进程初始化:由用户输入作业名、作业的到达时间和服务时间进行初始化; 3、 显示函数: 显示当前调度的是哪个作业,后备队列中有哪些...

    时钟.unitypackage

    建一个简单的时钟,并且给它加上一些组件脚本用来显示当前时间 指针正常走针 建一个简单的时钟,并且给它加上一些组件脚本用来显示当前时间 并且时间可以随着正确的时间而变化

    动态高优先权优先调度算法

    1、设置进程体:进程名,进程的到达时间,服务时间,初始优先权,进程状态(W——等待,R——运行,F——完成),进程间的链接指针 2、进程初始化:由用户输入进程名、服务时间、初始优先权进行初始化,同时,初始化...

    第7章_二叉树.pptx

    * 穿线二叉树的定义:穿线二叉树是一种特殊的二叉树,它的每个结点都有一个指向其后继结点的指针。 * 中序穿线二叉树:一种特殊的穿线二叉树,它的中序遍历结果是一个有序的序列。 五、树、森林与二叉树的转换 * ...

    boostdesc_bgm_files_build_opencv_contrib_needed.zip

    `boostdesc_bgm_files_build_opencv_contrib_needed.zip`中的`bootstesc_files`可能包含了Boost库的一些相关文件,Boost是一个C++库集合,提供了许多现代C++功能,如智能指针、正则表达式、线程支持等,是OpenCV编译...

Global site tag (gtag.js) - Google Analytics