C基础学习笔记——01-C基础第08天(指针上)

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

01-C基础第08天(指针上)

目录:
1、指针和指针变量
2、指针大小
3、野指针和空指针
4、万能指针void *
5、const修饰的指针变量
6、指针和数组
7、多级指针

1、指针和指针变量

(1)内存区的每一个字节都有一个编号,这就是“地址”。

(2)如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号)

(3)指针的实质就是内存“地址”。指针就是地址,地址就是指针。

(4)指针是内存单元的编号,指针变量是存放地址的变量。

(5)通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。

2、指针大小

(1)使用sizeof()测量指针的大小,得到的总是:4或8

(2) sizeof()测的是指针变量指向存储地址的大小

(3)在32位平台,所有的指针(地址)都是32位(4字节)

(4)在64位平台,所有的指针(地址)都是64位(8字节)

3、野指针和空指针

指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位为4字节,64位为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。

但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量(空闲可用),C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针。

 

4、万能指针void *

 void *指针可以指向任意变量的内存空间

1     void *p = NULL;
2 
3     int a = 10;
4     p = (void *)&a; //指向变量时,最好转换为void *
5 
6     //使用指针变量指向的内存时,转换为int *
7     *( (int *)p ) = 11;
8     printf("a = %d\n", a);

 

5、const修饰的指针变量

 1     int a = 100;
 2     int b = 200;
 3 
 4 //指向常量的指针
 5     //修饰*,指针指向内存区域不能修改,指针指向可以变
 6     const int *p1 = &a; //等价于int const *p1 = &a;
 7     //*p1 = 111; //err
 8     p1 = &b; //ok
 9 
10 //指针常量
11     //修饰p1,指针指向不能变,指针指向的内存可以修改
12     int * const p2 = &a;
13     //p2 = &b; //err
14     *p2 = 222; //ok

红框代表不可以这样操作。

 

6、指针和数组

数组名字是数组的首元素地址,但它是一个常量,不可以修改。

 

指针加减运算

(1)指针计算不是简单的整数相加

(2)如果是一个int *,+1的结果是增加一个int的大小

(3)如果是一个char *,+1的结果是增加一个char大小

指针数组:它是数组,数组的每个元素都是指针类型。

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     //指针数组
 6     int *p[3];
 7     int a = 1;
 8     int b = 2;
 9     int c = 3;
10     int i = 0;
11 
12     p[0] = &a;
13     p[1] = &b;
14     p[2] = &c;
15 
16     for (i = 0; i < sizeof(p) / sizeof(p[0]); i++ )
17     {
18         printf("%d, ", *(p[i]));
19     }
20     printf("\n");
21     
22     return 0;
23 }

 

7、多级指针

(1)C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。

(2)二级指针就是指向一个一级指针变量地址的指针。

(3)三级指针基本用不着,但考试会考。

 1     int a = 10;
 2     int *p = &a; //一级指针
 3     *p = 100; //*p就是a
 4 
 5     int **q = &p;
 6     //*q就是p
 7     //**q就是a
 8 
 9     int ***t = &q;
10     //*t就是q
11     //**t就是p
12     //***t就是a

 

在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

posted on 2020-06-02 11:56  Alliswell_WP  阅读(166)  评论(0编辑  收藏  举报

导航