=============================================================================
涉及到的知识点有:1、
=============================================================================
c语言是面向过程的语言,是弱类型语言,c语言的源代码基本就是无数个函数的堆砌。
即很多函数就组成c语言源代码了,也即它的源代码基本就是函数构成的。
C语言里面的test()和test(void)是不一样的。什么也不写的话,C语言就比较含糊了,容易出错,结果不可知。
C++语言里面的test()和test(void)是一样的。
c语言几个松散的地方(不足的地方,不严禁的地方,它容易出错的地方)。
课后思考:
写一个函数求字符串的长度。课后思考,用递归函数实现求字符串长度。
=============================================================================
指针
指针是c语言里面最抽象的、最重要的、最常用的。
指针的概念:
指针变量也是一个变量,
指针存放的内容是一个地址,该地址指向一块内存空间,
指针是一种数据类型(指针类型)。
--------------------------------------
计算机内存的最小单位是什么?BYTE(字节)
对于内存,每个BYTE(字节)都有一个唯一不同的编号,这个编号就是内存地址。
操作系统就给内存的每一个字节编了一个号,所以说:一个编号对应的是一个BYTE(字节)的空间大小。
打比方:
1 -> BYTE
2 -> BYTE
3 -> BYTE
4 -> BYTE
对应于
--------------------------------------
一个int多大?答:4个BYTE(字节),所以一个int占用了了4个编号(即4个不同的内存地址)。
地址的编号:在32位系统下是一个4个字节的无符号整数;在64位系统下是一个8个字节的无符号整数。
(因为地址不可能是负的,又因为无符号数可以表达一个更大的地址,有符号数表示的最大地址会变小)
-----------------------------------------------------------------------------
指针变量的定义:
可以定义一个指向一个变量的指针变量。
-----------------------------------------------------------------------------
取地址运算符 &
& 可以取得一个变量在内存当中的地址。(取地址取的是内存地址)
register int a; //寄存器变量,这种变量不在内存里面,而在cpu里面,所以是没有地址的,
所以寄存器变量不能使用&来得到地址。
-----------------------------------------------------------------------------
无类型指针
定义一个指针变量,但不指定它指向具体哪种数据类型。可以通过强制转化将 void * 转化为其他类型指针,
也可以用 (void *) 将其他类型强制转化为void类型指针。
void *p; 指针之间赋值需要类型相同,但任何类型的指针都可以赋值给 void * 。
-----------------------------------------------------------------------------
1 linux下示例代码如下: 2 3 int main() 4 { 5 int *p; //定义了一个可以指向int类型地址的指针变量,指针变量的名字叫p。*不是变量名字的一部分。 6 //int * 是一种数据类型。 7 int a; //定义了一个int类型的变量,int变量的名字叫a。 8 9 a = 1; //int * 和 int是两种不同的数据类型。 10 p = &a; //把a的内存地址赋值给p。 11 12 printf("%p\n", p); //0x7fff5b2faedc 输出的是a的首地址的编号,不会把四个编号都输出的。 13 //而且注意:每一次执行该代码后,输出的编号都会发生变化! 14 15 *p = 10; //通过指针变量间接的访问a的值,*p代表指针指向变量的值,p代表指向变量的地址。 16 printf("a = %d\n", a); //a = 10; 通过上面的方法把a的值改变了。 17 18 a = 100; 19 printf("%d\n", *p); //100 通过指针变量间接的访问a的值。 20 21 int b = 2; 22 p = &b; //又把b的内存地址赋值给p。 23 *p = 20; 24 printf("b = %d\n", b); //20 25 26 //char *p1 = &a; //相当于 char *p1; p1 = &a;//两个类型不相同的地址。即指针类型不兼容。那么我们强转试试! 27 char *p1 = (char *)&a; 28 a = 123456; 29 *p1 = 0; 30 printf("a = %d\n", a); //a = 123392 就算强转后也会出现问题,所以要避免指针类型不兼容问题。 31 32 void *p2; //可以指向任何类型的地址,void代表无类型。 33 34 return 0; 35 }
linux下代码截图如下:
-----------------------------------------------------------------------------
指针占用内存的说明
在同一个系统下,不管指针指向什么样类型的变量,地址的大小(或叫编号的大小)总是一样的。
1 linux下示例代码如下: 2 3 int main() 4 { 5 char *p1; 6 int *p2; 7 long long *p3; 8 9 printf("%lu, %lu, %lu\n", sizeof(p1), sizeof(p2), sizeof(p3)); //实质是:编号的大小是多少? 10 return 0; //输出的是 8, 8, 8 11 //地址的编号:在32位系统下是一个4个字节的无符号整数;在64位系统下是一个8个字节的无符号整数。 12 //指针变量的名字叫p1、p2、p3。指针变量的大小是多大呢?因为指针变量对应的是某某的首地址的编号, 13 //即指针变量对应的是编号,而编号就是内存地址。即编号在64位系统下是一个8个字节的无符号整数。 14 //所以指针变量的大小就是编号的大小,而编号在64位系统下用8个字节的无符号整数表示。 15 //举例子说明下:同一个酒店,房间的编号的长度都是一样的。 16 17 }
linux下代码截图如下: