初学指针

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

posted @ 2020-10-24 16:34  星卅  阅读(134)  评论(0)    收藏  举报