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) 编辑 收藏 举报