初学指针
1.内存
计算机中最小的单位是 bit(位)
就算计中最小的存储单位是字节(byte)
1字节=8位
运行的如软件、程序、游戏等都是在内存中进行
一个正在运行的程序叫进程
2.变量
2.1 定义变量
类型名+变量名
2.2 引用
使用变量名就是在使用变量名绑定的内存段
#include <stdio.h>
int main()
{
int x;//定义变量
x=1; //x的作用域在main函数中
printf(“%d\n”,x);
system("pause");
return 0;
}
3.地址与首地址
地址:内存通常被划分为一个一个的存储单元,一般以字节为单位,每个存储单元都有一个编号,这就是存储单元的“地址”。
首地址:变量的第一个地址就是首地址。
#include <stdio.h>
int main()
{
printf(“int=%d\n”,sizeof(int);//首地址可以是所占字节数的第一个字节
printf(“char=%d\n”,sizeof(char);
printf(“float=%d\n”,sizeof(float);
printf(“double%d\n”,sizeof(double);
system("pause");
return 0;
}
4.指针
首地址就是指针
在内存中,地址是连续的,这也就意味着知道了变量的首地址,知道了变量的类型,就可以确定变量对应内存段的值,因此把首地址称之为指针。
&:取首地址符 (也叫按位与运算符)
#include <stdio.h>
int main()
{
int x;//定义变量
x=10086; //四个字节,32位
/*十进制:10086 转换成二进制
二进制 0000 0000 0000 0000 0010 0111 0110 0110
0 0 39 102
x占据1个字节时是102
*/
//f5:调试;ctrl+f5:运行;
//char 类型存储有符号的是:-128-127;无符号的是:0-255;
printf(“地址:%#X\n”,&x);
printf("x1=%d\n",x);
getchar();
printf("x2=%d\n",x);
system("pause");
return 0;
}
5.指针变量
如果用一个变量专门用来存放另一个变量的地址(即指针),则称它为指针变量。
指针变量的存储单元存放的是地址(指针),不要将一个整数赋值给一个指针变量。
#include <stdio.h>
//指针类型是在普通类型的后面加了一个*,例如 int* p; 就是一个指针类型的变量,称为指针变量
int main()
{
int x=10086;//&x: x变量的首地址----指针
int* p;
return 0;
}
6.指针大小
#include <stdio.h>
int main()
{
int* p;
char* p1;
float* p2;
double* p3;
printf("int=%d\n",sizeof(int));
printf("char=%d\n",sizeof(char));
printf("float=%d\n",sizeof(float));
printf("double=%d\n",sizeof(double));
printf("\n");
printf("int*=%d\n",sizeof(int*));
printf("char*=%d\n",sizeof(char*));
printf("float*=%d\n",sizeof(float*));
printf("double*=%d\n",sizeof(double*));
printf("\n");
printf("p=%d\n",sizeof(p));
printf("p1=%d\n",sizeof(p1));
printf("p2=%d\n",sizeof(p2));
printf("p3=%d\n",sizeof(p3));
return 0;
}
/*结果:
int=4
char=1
float=4
double=8
int*=4
char*=4
float*=4
double*=4
p=4
p1=4
p2=4
p3=4
*/
7.解引用
知道变量名p,就知道p绑定的内存段中保存的地址&x,就能去操作&x只想的内存段。
#include <stdio.h>
int main()
{
int x=10086;
int* p=&x;//int*是一个数据类型,p是一个指针类型的变量 p是x变量的首地址
*p=100;
printf("%#X\n",P);//x变量的首地址
printf("%d\n",x);
return 0;
}
8.野指针
指针指向未知的内存段,把这样的指针称之为野指针。
#include <stdio.h>
int main()
{
int* p=3512;//p可以赋值,但没有修改的权限
*p=10086;//会报错
printf("%d",*p);
return 0;
}
9.空指针
int* p=NULL; NULL/空/0
#include <stdio.h>
int main()
{ int x=10086;
int* p=NULL;//空指针
p=&x;
if(NULL!=p){*p=100;}
else {
printf("这是一个空指针。\n");
return 0;}
printf("%d\n",*p);
return 0;
}
结果:没有定义x时,输出这是一个空指针;定义后输出结果为100.
10.万能指针
void* 定义的指针变量,就是万能指针
void* 可以表示任意类型的指针,可以是int char float double
#include <stdio.h>
int main()
{ int x=10086;//所有指针类型的数据都是四个字节
char word='A';
int* p=&x;
//char* q=&word;
int* q=&word // 此处会报错,可以强制类型转换,在&word前加上(int*)
//也可以使用万能指针void* q=&word;
printf("%d\n",*p);
return 0;
}
11.多级指针
*解引用与&取首地址符一一对应
int x=10086;
int* p=&x;
int** q=&p;
int*** q1=&q;
//q1是q的首地址
//*q1是p的指针即p的首地址
//**q1是x变量的首地址
//***q1是x对应的值
#include <stdio.h>
int main()
{
int x=10086;
int* p=&x;//p是x变量的首地址
int* q=&p;q是p指针的首地址
//int** q=&p;*q是指针p里面的内容;**q表示的才是x里面的内容
printf("%#X\n",&p);
printf("%#X\n",q);//两个printf()输出的是同一个地址
*p=100;
printf("x=%d\n",x);//输出结果为100
// *修改地址的操作是无意义的
//*q去修饰p里面的内容
*q=100;
printf("p=%d\n",p);
return 0;
}
#include <stdio.h>
int main()
{
int x=10086;
int* p=&x;//p是x变量的首地址
int** q=&p;q是p指针的首地址
printf("q=%#X\n",q);
printf("&p=%#X\n",&p);
printf("-----------------------\n");
printf("*q=%#X\n",*q); //*q是指针p的值,即x的首地址
printf("&x=%#X\n",&x);
printf("p=%#X\n",p);
printf("-----------------------\n");
printf("**q=%d\n",**q);
printf("X=%d\n",x);
printf("*p=%d\n",*p);
return 0;
}
结果:
q=0XB7FD7C
&p=0XB7FD7C
-----------------------
*q=0XB7FD88
&x=0XB7FD88
p=0XB7FD88
-----------------------
**q=10086
X=10086
*p=10086

浙公网安备 33010602011771号