码迷,mamicode.com
首页 > 编程语言 > 详细

c语言基础学习07

时间:2018-01-07 00:53:04      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:它的   size   内容   class   例子   amp   技术   c语言   --   

=============================================================================
涉及到的知识点有: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下代码截图如下:

技术分享图片

 

c语言基础学习07

标签:它的   size   内容   class   例子   amp   技术   c语言   --   

原文地址:https://www.cnblogs.com/chenmingjun/p/8215739.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!