首页 > 编程语言 > c语言程序设计知识点总结03

c语言程序设计知识点总结03

时间:2023-05-22 09:24:35浏览次数:42  
标签:知识点 指向 03 int void 内存 数组 程序设计 指针

c语言程序设计知识点总结03

地址(Address):

  计算机的内存由若干个字节内存单元构成,每个字节内存单元都有一个唯一的地址用于区分和存取单元中的数据。
  形式上,地址是一个无符号整数,从0开始,依次递增,在表达和交流时,通常把地址写成十六进制数。

指针(Pointer):

  一个变量,它存有另外一个变量的地址。

指针相关的两个基本运算符:

  1.  &:取变量的地址。
  
  2.  * :取指针所指的变量的内容。

指针的定义及初始化:

语法格式:   所指变量类型    * 指针名;
      例:(1)   int  x, *p = &x;  /* 定义了一个指向整型变量x的指针p*/
          (2)   int  x,*p;
               p = &x;     /* 同上 */
指针相关的表达式:
    假设有:int x, *p = &x; 则:
      p = &x       *p =  x     *&x = *p = x    &*p = &x = p   
      *p++ = *(p++)  :取p所指的变量,然后p指向下一个单元。
      (*p)++ :将p所指的变量加1。 

两种特殊的指针:

1.  void  *:指向空类型的指针
     指向void类型的指针可以容纳任何其它类型的指针,但容纳前必须强制转换为指向void类型的指针。
     例如假设有:int x,*p;void *p2;则:
     p2 = (void *)p;正确    而p2 = p;  错误。
2.  NULL:空指针或零指针
     由系统定义:#define NULL 0
     int   *p = NULL;  /* 表示现在指针p什么也不指向  */

指针的运算:

  1.  赋值运算:指向同类型变量的指针可以相互赋值。
  2.  加减小整数:向后或向前移动整数对应的元素个数。
  3.  指针相减:结果为两个指针间元素的个数。
  4.  指针比较:谁在前谁在后(所指的变量的地址)。

二级指针:

  指针所指的变量又是一个指针变量。如:
       int    x, *p1,  **p2;

       p1 = &x;      /* p1指向x   */
       p2 = &p1;    /* p2指向p1 */

指针与一维数组:

  int  a[5] = {1, 2, 3, 4, 5};
  int  *p = a;       /* 等价于 int  *p = &a[0];  */
  则有数组元素a[i]的三种引用形式:
    a[i] = *(a + i)  =  *(p + i)     /* 即a+i和p+i都等于&a[i] */
注意:
     1.  指针+1的含义是指针指向下一个数组元素。
     2.  指针-1的含义是指针指向前一个数组元素。
     3.  指针可以加减,但数组名是常量地址,不能加减。
         即:p++,p-- 合法,但a++,a-- 不合法。

指针与二维数组:

  int  a[2][3] = {{1, 2, 3}, {4, 5, 6}};

  则有数组元素a[i][j]的三种引用形式:
      a[i][j] = *(a[i] + j)  =  *(*(a+i) + j)    
    /* a + i  指向第 i 行,a[i] 指向第 i 行的第一个元素a[i][0]  */
注意:     
    1.  a[0], a[1]各是一个一维数组,a[0] = {1, 2, 3}而a[1] = {4, 5, 6}。
    2.  由于数组名是指针,所以a[0], a[1]分别指向二维数组的第一行
                和第二行的首元素,即a[0] = &a[0][0],a[1] = &a[1][0]。
    3.  数组a是由两个一级指针构成的数组,其元素分别为a[0]和a[1]。

指针数组:

  数组元素是指针的数组。如:
      char *str[3] = {“a1”, “a2”, “a3”};
注意:
    1.  str为有3个元素的一维数组。
    2.  每个元素都为一个指针,即数组元素 str[0], str[1], 
        str[3]均为 char *类型的指针。

指向数组的指针:

  int  a[2][3] = {1, 2, 3, 4, 5, 6};
  int  (*p)[3];   /* p指向一个数组,该数组有三个整型元素 */
  p = a;           /*  则(*p)[0] = a[0][0],  (*p)[1] = a[0][1]  */
  p = a + 1;     /*  则(*p)[0] = a[1][0],  (*p)[1] = a[1][1]  */

注意:
    1.  二维数组名本质是一个指向数组的指针。
    2.  a + i 指向二维数组的第 i 行,称为行指针。

内存分配:

  1.  程序执行时必须加载到内存。无论是代码还是数据都必须在内存中获得存储单元。
  2.  代码加载到称为代码段的内存区域。
  3.  全局变量、静态变量和字符串常量加载到称为数据段的内存区域。
  4.  局部变量在执行到相应的函数代码块时才在栈上分配内存,函数退出时则释放该内存。
  5.  程序在运行时还可以向操作系统动态申请获得内存,操作系统负责从它管理的堆内存中分配一内存块,并返回内存块的首地址。当程序用完该动态申请的内存块后,可以向操作系统申请,由操作系统负责释放并回收该内存块。
  
 注意:
	 1,2,3,4由编译程序和装入程序负责分配内存,而5由程序向操作系统负责申请和释放内存。

动态内存分配涉及到的库函数:

void *malloc(unsigned int size);
成功:返回所开辟空间首地址
失败:返回空指针	功能:向系统申请size字节的堆存储空间

void *calloc(unsigned int num, unsigned int size);	
成功:返回所开辟空间首地址
失败:返回空指针	功能:按类型申请num个size大小的堆空间

void free(void *p);	
无返回值	       功能:释放p指向的堆空间
void *realloc(void *p,unsigned int size);	
成功:返回新开辟空间首地址
失败:返回空指针	功能:将p指向堆空间变为size大小

动态内存分配涉及到的库函数使用说明:

1.由内存分配函数返回的是void *类型的指针,使用时必须先转换为
 自己需要的类型。如:
    double  *pd = NULL;
    pd = (double *) calloc(10, sizeof(double));
2.  申请的内存块大小一般由sizeof运算符自动计算,以适应不同的编译器,从而增加程序的可移植性。
3.  由于内存分配不一定成功(如内存耗尽 ),所以程序中一定要判断是否申请成功,成功后才能使用该指针。
    if(p == NULL)
    {/* 或者  if  ( !p )  */
        printf(“内存耗尽!”);
        exit(1);
    }
4.  程序使用完动态申请的内存块后一定要释放,否则会造成内存泄露,即程序运行一次,内存就丢掉一块(没有回收再利用)。

函数调用过程:

​ 函数调用时,在执行流程转至被调函数的代码执行之前,必须先完成将实在参数传递给形式参数的过程。这个过程完成后,再顺序执行被调函数的代码,直到遇到return语句返回或者代码执行完毕返回到被调用处继续执行(除非程序异常退出)。
函数参数传递的两种方式:

1.  传值:将实参的值传给形式参数,此后形参实参两者各不相干,对形参的任何改变不影响实参。
2.  传地址:将实参的地址传给形式参数,此后形参实参两者合二为一,对形参的任何改变其实就是改变实参。

指针作为函数参数:实质是传地址。

数组作为函数参数:传数组的首地址,而不是把每个数组元素传过去。

命令行参数的概念:

​ 程序在执行时,由命令行传递给程序的参数。实质是操作系统将命令行参数组织成一个字符串数组,然后将它传递给main函数。程序中可对该字符串数组进行处理。命令行参数就是main函数的参数。

main(int argc, char *argv[ ])
程序执行:程序名  字符串1  字符串2   ...     字符串n
           ↑       ↑         ↑               ↑
        argv[0]  argv[1]   argv[2]    …   argv[n+1]
        argc = n + 1,此处共有n + 1个命令行参数。
/*
* 第一个参数int argc:指明命令行参数的个数。
* 第二个参数char *argv[ ]:一个数组,每个数组元素为传过来的一个命令行参数(字符串)。也可写为:char **argv 。
*/

返回指针的函数:

该函数的返回类型是指针类型,即函数返回一个指针。
    例:   int  *pi = NULL;
           pi = (int *) malloc(sizeof(int));

指向函数的指针:

语法格式:
    函数返回类型  (*函数指针名)(函数参数)
例:定义时:
         int   sum(int i, int j) {  …  }
         int  (*p)(int a, int b);
         p = sum;
   调用时:  (*p)(3,  5) 就等价于sum(3, 5)。

标签:知识点,指向,03,int,void,内存,数组,程序设计,指针
From: https://www.cnblogs.com/Mr-black-7/p/17419704.html

相关文章

  • 程序设计进阶模拟试题
    题目描述程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能是:使数组右上三角元素中的值乘以m。#include<stdio.h>#include<conio.h>#include<stdlib.h>#defineN5intfun(inta[][N],intm)/不得改动此注释文字及位置,begein/{}/不得改动此注释文字......
  • 03、Etcd 客户端常用命令
    上一讲我们安装etcd服务端,这一讲我们来一起学学如何使用etcd客户端常见的命令。文章内容来源于参考资料,如若侵权,请联系删除,谢谢。etcd可通过客户端命令行工具etcdctl对etcd进行请求操作#帮助命令,会列出所有的命令和选项,在记不太清命令的时候,可以使用etcdctl‐h#......
  • WEB—漏洞必懂知识点
     CTF,SRC,红蓝对抗,实战等SRC:针对与网站上面的漏洞,进行提交漏洞并证实可以获得相应的佣金。偏向于实战,重点掌握获取网站权限 漏洞等级划分高危:SQL注入,文件上传,文件包含,代码执行,未授权访问——直接影响到网站权限和数据库权限,能够直接获取数据或者获取到一些敏感信息只要涉......
  • 【CSP 202303-4】星际网络Ⅱ 【离散化+线段树】
    题目链接http://118.190.20.162/view.page?gpid=T162题意一个网络地址由\(n\)(\(n\leq512\),且是16的倍数)位二进制位组成(形如xxxx:xxxx:....:xxxx),有若干用户需要申请一些网络地址。有三种操作:申请。给出一个用户编号,和要查询的地址区间[L,R],若全都没有被申请过,或者......
  • 网络编辑的使用和知识点,进程线程之间实现交互
    软件开放的框架c/s架构c就是Client客户端就是要去请求数据的s就是Server服务端就是给客服端根据客户的要求提供数据的服务端的必备条件时刻提供服务等待客服端的访问有一个固定的地址能够接受多个服务端的请求(高并发)B/s架构B就是Browser就是一个浏览器充当所有服务端......
  • HDU-1003- Max Sum (动态规划)
    MaxSumTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):192050    AcceptedSubmission(s):44727ProblemDescriptionGivenasequencea[1],a[2],a[3]......a[n],yourjobistocalculatethe......
  • 树相关知识点--零碎笔记
    深入理解前中后序二叉树的前中后序遍历是什么?前中后序遍历,即二叉树结构的前中后位置前序遍历-即刚刚进入一个节点的时候中序遍历-即进入节点之后未离开节点之前后序遍历-即即将离开第一个节点的时候前中后序是遍历二叉树过程中处理每一个节点的三个特殊时间点前--刚刚进入一个二......
  • 【linux基础-03】Linux命令速查手册
    查看Linux系统信息arch#显示机器的处理器架构(1)uname-m#显示机器的处理器架构(2)uname-r#显示正在使用的内核版本dmidecode-q#显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda#罗列一个磁盘的架构特性hdparm-tT/dev/sda#在磁盘上执......
  • 面向复用的软件构造技术知识点总结
    知识点概要:什么是软件复用?如何衡量“可复用性”?可复用组件的级别和形态——源代码级别的复用——模块级别的复用:类/抽象类/接口——库级别的复用:API/包——系统级别的复用:框架设计可复用的类——继承与重写——重载——参数多态与泛型编程——行为子类型和Liskov替......
  • C/C++程序设计课设题[2023-05-20]
    C/C++程序设计课设题[2023-05-20]ATM仿真系统-薛景背单词-叶水仙-理科实验班电信优惠套餐推荐系统的设计与实现-朱立华-通信工程多媒体文件管理及检索系统-刘林峰-广播电视工程公交路线自动化选择系统实现-张勤-测控技术与仪器基于朋友圈的商品推荐-汪云云-自动化基于数据......