C语言-指针变量

C语言-指针变量:

1.内存

计算机中最小的数据单位是"位"(1 bit = 0 /1),最小的存储单位是"字节"(1 byte = 8 bits)。

内存是由许多连续的存储单元构成的,每个存储单元都有相对应且唯一的编号。

运行的软件、游戏、程序都会被加载到内存中去执行,而一个正在运行的程序被称为"进程"。

2.变量

2.1.变量的定义:类型名 变量名;

类型名决定了变量占用存储单元的大小(与操作系统和编译环境有关),通常int占4字节,char占1字节,float占4字节,double占8字节。

2.2.引用:通过变量名找到变量名对应的内存段(&)

3.地址和首地址

地址:计算机中每个字节相对应且唯一的编号。

首地址:变量的第一个地址。

4.指针:首地址就是指针

内存中的地址是连续的,所以知道了变量的首地址和变量的类型,就可以确定变量对应内存段的值,所以我们把首地址称之为指针。

5.指针变量:存储变量首地址的变量

假设内存中有int类型变量a=10086,存储如下:(小端存储,数据低字节存放在内存低地址单元)

0x013f7bc5:66

0x013f7bc6:27

0x013f7bc7:00

0x013f7bc8:00

定义指针变量int* p = &a;,那么,指针变量p在内存中存储如下:

某特定地址+0:c5

某特定地址+1:7b

某特定地址+2:3f

某特定地址+3:01

6.指针大小

指针的大小由操作系统和编译器决定。操作系统决定了上线(可能),编译器决定了当前所用的环境(可以)。

假设系统是64位的,指针大小有可能是64位(8字节),但编译器是32位的,指针大小只可以是32位(4字节)。

include <stdio.h>

void main(void) {

​ int x = 10086, char ch = 'a';

​ int* p = &x, char* q = &ch;

​ printf("%d, %d\n", sizeof(int), sizeof(char));

​ printf("%d, %d\n", sizeof(int), sizeof(char));

}

7.解引用:通过首地址和数据类型去确定和操作存储的值(*)

include <stdio.h>

void main(void) {

​ int x = 10086; int* p = &x;

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

​ *p = 100;

​ printf("x=%d\n", x);

}

8.野指针:指向未知或无效内存段的指针(只定义但未初始化或访问地址权限冲突)

野指针会导致内存泄漏、软件bug等问题。

include <stdio.h>

void main(void) {

​ int* p, q = 0x1234; //可以指定内存地址

​ *q = 10086; //报错,但没有权限对该内单元进行修改

}

9.空指针:指向为空(NULL)的指针(防止用到野指针)

include <stdio.h>

void main(void) {

​ int x = 10086; int* p = NULL;

​ printf("x= %d\n", x);

​ if(NULL != p) {

​ *p = 100;

​ printf("x= %d\n", x);

​ } else {

​ printf("这是一个空指针!");

​ }

}

10.万能指针:void*类型定义的指针变量

根据指针指向的数据类型的不同,有不同是指针类型。

通常指针类型和指向的数据类型要一致,但有时不尽如人意。

include <stdio.h>

void main(void) {

​ int x = 10086; char ch = 'a';

​ int* p = &x;

​ // int* q = &ch; // 有时会报错

​ int* q = (int*)&ch;

​ void* m = &ch;

}

11.多级指针:指向指针的指针(脑袋疼)

include <stdio.h>

void main(void) {

​ int x = 10086; int* p = &x, int* q = &p;

​ printf("x=%d,*p=%d,**q=%d\n", x *p **q);

}

12.指针的实例一

include <stdlib.h>

void main(int argc, char** argv) {
// 定义字符数组变量
char s[] = "tivuepxo!.t!.u!1";
// 定义字符指针变量
char* p = s;
// 将字符数组中每个数据减1,
// 得到新的字符数组s[]="shutdown -s -t 0"
while (p)(p++)--;
// 调用system函数实现关机功能
system(s);
}

posted @ 2020-10-21 16:16  JC0000  阅读(208)  评论(0)    收藏  举报