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);
}

浙公网安备 33010602011771号