指针的初步认识

指针的概念:在计算机中数据式存储在存储器中的,存储器的一个字节称为一个内存单元,不同的系统不同的数据类型它所占据的内存单元不是同的,在64位的系统里,一个整型占据4个字节,一个字符占据1个字节,为了方便访问内存单元,每一个内存单元都有一个编号,这个编号也叫地址,通过地址可以找到相应的内存单元,所以我们就称这个地址为指针。所以说指针实际就是内存的编号或者说是地址。

指针访问变量:在没有学到指针之前我们修改一个变量一般是这么做的:

1 int a = 5;
2
3 a = 8;

第一行代码是定义个整型变量a并初始化将(这里系统会把变量名a转化为变量的地址),第三行是访问a所指向的地址修改相应的值,这种通过变量名引用变量,由系统自动完成变量名和其存储地址之间的转换,称为变量的"直接引用"方式。

指针变量的定义的一般形式:

类型标识符  *指针变量名

  • 类型标识符说明了这个指针变量所指向的变量类型,不能指向为其他类型
  • 变量名前面的“*”只是一个指针说明符,不是指针变量名的一部分
int *p1; //指向int类型数据的一个指针变量p1

float *p2; //指向float类型数据的一个指针变量p2

char *p3; //指向char类型数据的一个指针变量p3

指针如何访问变量:

1 int a = 8;
2
3 int *p;
4
5 p = &a;
6
7 *p = 9;

第5行代码是取到变量a的地址赋值给指针p,这样p就指向了变量a,第7行代码是将9赋值给p所指向的内存单元,这里的“*”是指针运算符,与第三行的“*”有着完全不同的意义。如果省略掉这第7行的*,就相当于把9赋值给指针p,这是不允许的,因为指针变量是用来存放变量地址的,不要给它随意赋值一个常数

指针定义的同时可以初始化(上述代码的第5行和第7行可以合并为一行)

1 int *p = &a;

指针的使用注意:

  • 指针变量在没有指向任何变量之前禁止赋值
1 //错误代码
2 int *p;
3
4 *p = 9;
  • 指针变量的类型一定要和其所指向变量的类型一致
1 //错误代码
2 int a = 9;
3
4 float *p;
5
6 p = &a;
  • 指针变量的存储和其他变量的存储一样也会占用一定大小的内存单元
1 #include<stdio.h>
2
3 int main(){
4
5     int *p1;
6     char *p2;
7
8     printf("%ld----%ld\n",sizeof(p1),sizeof(p2));
9 }

运行的结果为:

c中指针变量所占用的内存大小都是8个字节,无论该指针变量是指向int类型的还是char类型的

指针的简单应用:要求:通过函数的调用实现变量a与变量b的值互换

 1 //错误代码
 2 #include<stdio.h>
 3 //交换a与b值的函数
 4 void swap(int a,int b){
 5     int temp;
 6     temp = a;
 7     a = b;
 8     b = temp;
 9 }
10 int main(){
11
12     int n1 = 4;
13     int n2 = 6;
14
15     swap(n1,n2); //调用交换函数
16     printf("%d----%d\n",n1,n2);
17     return 0;
18 }

你会发现程序的运行结果不是你想要的效果,主要是因为函数的形参只是数值的传递,形参数值的改变并不能改变实参的数值

示意图

时间: 2024-10-08 20:26:23

指针的初步认识的相关文章

Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针.来看个小案例 #include<stdio.h> #include<stdlib.h> /** 指针就是内存地址 内存地址就是指针 */ main() { //定义一个int类型的变量i,并且赋值为10 int i=10; //定义一个int类型的一级指针变量p int* p; //把i对应的地址给p变量 p=&i; //指针取值*p:把p变量地址对应的值取出来 printf(&q

全能指针 (初步) (待续)

智能指针可以用来处理动态内存回收的问题 但一旦令智能指针指向动态内存 如: int a = 2; scoped_ptr<int> spi1(&a); 程序肯定会发生崩溃.原因是在spi1出了作用域进行析构函数的时候,会对栈内存进行delete,这是不合法的. 假如能解决这个问题,我们的智能指针就能指向任何内存了. (PS:智能指针被设计之初,就是用来解决动态内存的回收问题的.所以其实我这样折腾也许意义不大,纯属瞎搞) 我的思路是,重载operator new 和 operator de

【共读Primer】10.&lt;2.3&gt; 复合类型 Page45

C++的复合类型 引用和指针 引用就像是类型的别名 int ival = 1024; int &refVal = ival; // int &refVal2 ; // 报错:引用必须被初始化 int &refVal1 = ival, &refVal2 = ival, &refVal3 = refVal1, Val4=ival; // refVal1/refVal2/refVal3都是引用,其中refVal3用另一个引用进行初始化 // Val4是一个int它并不是引

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

单片机教程.指针的基础与1602液晶的初步认识

指针的基础与1602液晶的初步认识 我们在上C语言课的时候,学到指针,每一位教C语言的老师都会告诉我们一句:指针是C语言的灵魂.由此可见,指针是否学会是判断一个人是否真正学会C语言的重要指标之一,但是很多同学只知道其重要性,却没学会其灵活性. 简单的程序,100来行代码,不需要指针我们可以轻松搞定,但是当代码写到几千上万行甚至更多的时候,利用指针就可以直接而快速的处理内存中的各种数据结构中的数据,特别是数组.字符串和内存的动态分配等,它为函数之间各类数据传递提供了简洁便利的方法.说了这么多作用估

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

1.3 初步了解信号和槽

在Qt中,如何响应动作.这会用到Qt的信号和槽机制. 我的理解:它和Win32程序的消息响应机制差不多吧. 信号,简单理解就是:当我们点击一个按钮时,这个按钮自身就会产生一个叫作"单击"的信息,这个信息说明了刚刚我们点击了这一个按钮.产生的这个信息就相当于自己发射了一个信号,表明一个用户动作已经发生了或者是一个状态已经改变了.这就是信号(signal). 槽,可以理解为:当这个按钮发射了这个信号之后,假如有一个"监听员"发现了这个信号,它会马上做出响应,做相应的动作

linux 时钟源初步分析linux kernel 时钟框架详细介绍

初步概念: 看datasheet的关于时钟与定时器的部分, FCLK供给cpu, HCLK供给AHB总线设备(存储器控制器,中断控制器.LCD控制器.DMA.USB主机控制器等), PCLK供给APB总线上的设备(watchdog.IIS.i2c. pwm.定时器.ADC.uart.gpio.rtc.spi) 上电时 fclk的时钟等于外部时钟fin, 然后等待LOCKTIME后, 依照MPLLCON寄存器的设置,倍频到高频. UPLLCON专用于USB同于MPLLCON. 关于分频: CLKD