c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量

一、内存

/*

 内存:
          存在内存里的。

 内存分了N多个小空间,每个小空间1个字节

 每个小空间有它自己的地址。每个地址之间差1

 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址,而记住首地址就行了(因为首地址相当于入口或者生活中的门)

 指针:

    指针就是地址,地址就是指针。

    地址:内存的地址

 内存中的地址:
        其实也是从1开始编号,然后一直自增
        1M内存,1024个地址

 0x7fff5fbff7cc:这叫16进制

 十进制:逢10进1        有:0  1  2  3  4  5  6  7  8  9
                       逢十进1
                                9   10

 十六进制:就是逢16进1

                      有:0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

 以0x开头
        简单说1-10
                0x1   0x2  0x3  0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
            16:0x10

 0x35:53

 0xa0:160

 顺带说下:
    二进制:0和1
            0   1  10

    八进制:0 1 2 3 4 5 6 7 

*/

二、指针变量

/*
指针变量:存放地址的变量。
        语法:类型  *指针变量名;
        赋值:指针变量名  = 地址;
在声明的时候初始化:类型  *指针变量名 = 地址;
例如:
int num = 20;
int *nump = #//存的是num的地址
打印指针变量:
         printf("%p \n %p \n",nump,&num);
注意:定义指针变量,有如下几种方式:
            1、类型  *  变量名 ;
            2、类型*  变量名 ;
            3、类型  *变量名 ;
以上三种都可以,*  代表一个特殊类型。
类型*  构成了类型
*/

上面介绍了怎么去定义一个指针变量,下面介绍怎么使用它。

/*

 使用指针变量

        语法:
                *指针变量名;

        语义:这就可以访问你所指向的那块空间里的值了

 千万要注意:
    访问指针变量时加星号和不加星号的区别:
            int num;
            int *p = #

            1.加星号代表,是访问它所指向的空间里面的值。*p 相当于  num;

            2.不加星号代表,是访问它自己的空间里面的值。p 就是自己里面存的值

*/
//例如:

    int num = 10;

    int *pNum;

    pNum = # //注意:&不要省略!

    printf("%d   %d\n",num,*pNum);//所以也就是说,*pNum == num;

    *pNum = 30;

    printf("num=%d\n",num);//30

    num =  90;

    printf("*pNum=%d\n",*pNum);

    int num = 10;

    int *pNum = #

    (*pNum)++;  //相当于num++ num=11

    num += 20;

    printf("num=%d\n",num);//31

    int num = 10;

    int *pNum = #

    int *pNum2 = pNum;

    *pNum2 = 30;

    printf("num=%d  *pNum=%d     

    *pNum2=%d\n",num,*pNum,*pNum2);//30 30 30
    

一定要注意在使用指针变量的时候,加星号(*)和不加星号(*)的区别;同时指针变量也区别类型(区分类型是为了告诉指针,该去读取几个字节)。

什么类型的变量就用什么类型的指针去读取。

下面看一个例子:

int num1 = 10,num2 = 20;
int *p1 = &num1;
int *p2 = &num2;
int *p3 =  p2;
*p2 = 40 ;
p2 = p1;
*p2 = 30;

printf("num1 = %d   num2 = %d   *p1= %d   *p2= %d   *p3= %d ",num1,num2.*p1,*p2,*p3);
/*
有兴趣的可以自己算下。
*/

指针变量作为函数的参数:

/*
语法:
返回值类型 函数名(指针类型*  指针变量名){

}

例如:
void test1(int*  num){

}

int main(int argc,const char argv[]){
     int num = 10;
     test1(&num);
}
*/
时间: 2024-08-11 07:35:09

c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量的相关文章

c语言学习之基础知识点介绍(二十):预处理指令

一.预处理指令的介绍 预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令. 特点:以#开头,不要加分号. #include: 文件包含指令 把指定文件的内容复制到相应的位置 #define: #define 宏名 替换的值; 宏.宏定义或者还叫宏代换. 作用:就是在编译之前把所有用到这个宏的地方,替换成你指定的东西 规范:宏名大写,可以跟变量区分开来 之前学的宏: INT32_MAX INT32_MIN 宏不占据内存空间,只是帮你做简单的替换. 注意: 1.宏只是简单的替换,不参与编译

c语言学习之基础知识点介绍(三)

本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例如:int num =0; csanf("%d",&num);printf("num = %d \n",num); 注意:格式化控制符前面要求输入什么类型的数据,那么地址列表那里就必须只能放相应类型变量地址.输入值的时候可以指定输入值的分隔符, 也可以 默认用回

oc语言学习之基础知识点介绍(五):OC进阶

一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点语法的语法: 对象.属性; 注意:这里的属性不需要加_ 对象.属性 = 值; 点语法的本质: 其实就是调用getter或者setter方法. 点语法注意事项: 1.在类的方法里面如果用self.age 这个是调用方法,self->_age 是直接调用成员变量. 2.千万记得不要在setter或者ge

oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造成内存泄露 全局区:所有的全局变量和静态变量 常量区:所有的常量 代码区:程序编译后的指令集 类是模板,肯定需要存在内存里面,因为实例化对象的时候需要根据这个模板来创建,那么存在内存里面,存在哪呢?? 类模板存在:全局区! 存的是:类的描述,还有所有的方法实现 每个对象都会有一个系统给我们的isa指

oc语言学习之基础知识点介绍(一):OC介绍

一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) { //main函数 @autoreleasepool {//自动释放池,我们现在写代码最好都写这里面 NSLog(@"Hello, World!"); //输出语句 } return 0; //退出程序,返回一个值给系统看 } 二.OC中的字符串 /* 前缀的概念:(了解一下) 提供框架的作

c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区

一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变量. static: 修饰局部变量:      可以把局部变量变为静态变量.意思就是:程序一启动就加载,程序退出才会回收空间(跟全局变量很像) .   静态变量:用static修饰的局部变量就叫静态变量. 修饰全局变量:            让全局变量只能在本模块中访问.     修饰函数:   

c语言学习之基础知识点介绍(十九):内存操作函数

一.malloc函数 /* 首先需要导入头文件 #include <stdlib.h> malloc void* malloc(n); n是字节大小 开辟堆空间,开辟的字节数以n为准 返回的是开辟空间的首地址 void*是万能指针,也就是说你可以用任意类型的指针去指向 */ //malloc用法 int *p = malloc(sizeof(int)); *p = 30; printf("%p %d\n",p,*p);//0x100105490 char *pc = mal

c语言学习之基础知识点介绍(一)

本系列是为了学习ios做准备的,也能作为c语言入门的教程看看. printf函数: printf函数作为输出语句,主要的作用个就是输出用户想输出的语句. 例如:printf("我是一个大帅哥~~"); printf("数字1=%d,数字2=%d",10,20);//%d接下来会在一起解释. /* %d:填入int,short型的数据,例如printf("数字1=%d,数字2=%d",10,20); %ld:填入long型的数据,例如printf(

oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍

一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类的方法,绝对不是再写一个自己类的方法. 代码中原话叫:子类重写父类方法. 因为父类定义的方法不一定适用于子类. 注意:如果有重写,那么调用的是自己重写后的方法,如果没有重写,那么就调用的是父类的方法. 所以我们方法有一个执行的过程: 1.先去自己类里面找这个方法,如果找到就执行. 2.如果没找到,就