1.当数组当作函数参数的时候会退化为指针

#include<stdio.h>
#include<stdlib.h> void sort(int a[]){
int num = sizeof(a);
printf("数组的大小num=%d\n", num);//打印4,此时a是一个指针
//打印数组
for (int i = ; i < ; i++)
{
printf("%5d", a[i]);
}
} void main(){
int a[] = {,,,,,,,,,};
sort(a);
system("pause");
}

2.数据类型的本质上是固定内存大小的别名,数据类型的作用是编译器预算对象(变量)分配的内存空间大小

//数据类型的本质
#include<stdio.h>
#include<stdlib.h> void main(){
int b = ;//int数据类型表示:创建int型的变量需要在内存中分配4个字节大小的空间
int a[] = {,,,,,,,,,};//int []数据类型表示:创建一个int型数组需要在内存中分配sizeof(int)*10=40个字节大小的空间
char ch = 'a';//char数据类型表示:创建char型的变量需要在内存中分配1个字节大小的空间
float fdata = 1.0;//float数据类型表示:创建float型的变量需要在内存中分配4个字节大小的空间
short sdata = ;//short数据类型表示:创建short型的变量需要在内存中分配2个字节大小的空间
double dd = 1.0;//double数据类型表示:创建double型的变量需要在内存中分配8个字节大小的空间
char *p = NULL;//char *数据类型表示:创建char *型的指针变量需要在内存中分配4个字节大小的空间,
//所以指针类型变量都是分配4个字节大小的内存空间
//结构体,共用体则需要根据各自的特性去计算分配内存空间
}

3.字符串常量因为c++编译器的优化,相同的字符串常量只会在代码去创建一个变量

4.头文件string.h下的strcpy()函数的本质,是将原来字符串str复制到新指针p所指向的内存空间,而不是将原来字符串str的地址赋值给新指针p,因此新指针p必须满足有对应的内存空间(即指针p必须有值)

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> void main(){
char *p = NULL;
char *p1 = NULL;
strcpy(p, "asadf");//会报错 指针p是空指针,没有对应的内存空间,所以*p会直接读取0x000000的地址,而0x000000是系统专用
//strcpy()的本质
/*while (p=='\0'){
*p = *p1;
p++;
p1++;
}*/
system("pause");
}

5.对于动态分配的内存而言,并不支持单个内存单元的释放,只能释放整个动态内存

//动态分配内存的释放

#include<stdio.h>
#include<stdlib.h> //定义数组大小
#define N 10 void main(){
//创建int类型数组
int *p = (int *)malloc(sizeof(int)*N);
for (int i = ; i < ; i++)
{
*(p + i) = i + ;
}
for (int i = ; i < ; i++)
{
printf("%5d", p[i]);
}
//对于动态分配的内存而言,并不支持单个内存单元的释放,只能释放整个动态内存
//例如
//free(p+1); 程序报错
//释放动态内存,只能释放头指针
free(p);
//避免野指针,必须将P赋值NULL
p = NULL; system("pause");
}

6.数组[]的本质是c/c++编译器帮我们做了一个*p的操作

//数组[]的本质

#include<stdio.h>
#include<stdlib.h> //定义数组大小
#define N 10 void main(){
//定义数组
int arr[N] = { ,,,,,,,, };
//定义数组指针
int *p = arr;
//[]取值方式
for (int i = ; i < N; i++)
{
printf("%5d",arr[i]);
//arr是一个指针;arr[i]===>arr[0+i]===>*(arr+i)
}
printf("\n");
//指针取值方式
for (int i = ; i < N; i++)
{
printf("%5d", *(p+i));
}
printf("\n");
//总结:
//*p是程序员手动的使用指针去完成间接取值(赋值)
//[]是c/c++编译器帮我们做了一个*p的操作
system("pause");
}

C语言 日常小结的更多相关文章

  1. C语言 指针小结

    指针 -->指针变量 类型名 *变量名 int *point1; char *point2; 注意:*p可以直接使用,它代表指针p指向的变量,*p可以当做被指向的变量使用!~~~~ 一个变量的地 ...

  2. go语言 hello 小结

    在编译go语言的时候: 写了一段这样的代码 package main import "fmt" func main() {     fmt.Println("Hello, ...

  3. 2014.3.11-C语言学习小结

    文件操作: 知识点: 持久化 1.文本文件的读写 2.二进制文件的读写 3.缓冲文件系统 1.打开文件 2.读写文件 3.保存 4.关闭文件 ============================= ...

  4. 2014.3.5-C语言学习小结

    知识点: 1.结构体 struct 2.联合体 union 3.枚举 4.结构.联合与函数 =========================== 结构体 思考:如果现在希望保存一个学生的信息,该如何 ...

  5. R语言画图小结

    本文以1950年到2010年期间我国的火灾统计数据为例,数据如下所示: (0)加载数据 data<-read.csv("E:\\MyDocument\\p\\Data\\1950~20 ...

  6. 李洪强漫谈iOS开发[C语言-053]-小结

    /* 已经学习过的C语言语法 01 基本C程序结构 int main (void) int main(int argc,char *arv){...} 02 基本语句(输入输出) 基本头文件: #in ...

  7. Golang语言细节小结

    前段时间,看了菜鸟入门,较浅的认识一下golang的语法习惯和规则,然后跟别人做了个爬虫项目,但是对于golang语言的语法结构还不是很懂.又看了遍<go实战>第二章. 构建程序在构建可执 ...

  8. C/C++语言 预处理小结

    预处理功能主要包括宏定义,文件包含,条件编译三部分.分别对应宏定义命令,文件包含命令,条件编译命令三部分实现. 预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换.预处理 ...

  9. 2014.3.6-C语言学习小结

    链表基础: 知识点: 1.链表基础 2.节点的创建和添加 llist_append_node 3.链表的遍历 llist_print_each 4.链表的查找与修改 5.链表的插入与删除 6.链表的销 ...

随机推荐

  1. 【读书笔记】iOS-垃圾回收

    Objective-C的垃圾回收器是一种继承性的垃圾回收器.与那些已经存在了一段时间的对象相比,新创建的对象更可能被当成垃圾.垃圾回收器定期检查变量和对象以及它们之间的指针,当发现没有任何变量指向某个 ...

  2. Xcode的内存清理

    1.删除Xcode中多余的证书provisioning profile 手动删除: 打开finder,然后在最上面的前往中前往下方的路径,就可以看到你xcode运行到现在使用过的证书provision ...

  3. UVa 111 - History Grading (by 最长公共子序列 )

     History Grading  Background Many problems in Computer Science involve maximizing some measure accor ...

  4. 软件测试Lab2

    1.本次上机实验任务:使用webDriver完后自动化测试 2.本次上机实验目的:掌握webDriver的用法和配置. 3.本次上机实验内容: 3.1Selenium的安装: 首先我们上Seleniu ...

  5. 获取tomcat上properties文件的内容——方便文件存储位置的修改,解耦和

    在java web开发的时候经常会用到读取读取或存放文件,这个文件的默认路径在哪里呢?写死在程序里面显然是可以的,但这样子不利于位于,假如有一天项目从window移植到linux,或者保存文件的路径变 ...

  6. C# Graphic 绘制圆、三角形、椭圆、图片

    在form和panel上可以绘制图形,线段,圆,文字,图形等等. 绘制代码必须放在OnPaint()函数里面,因为窗体刷新的时候,都会调用该函数,重新刷新所绘的图. 示例代码在Panel上绘制图形来简 ...

  7. redis unwatch discard

    UNWATCH UNWATCH 取消 WATCH 命令对所有 key 的监视. 如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行UNWATC ...

  8. Doctype文档类型、作用及触发方式

    Doctype文档类型 1)  该标签可声明三种 DTD 类型,分别表示严格版本.过渡版本以及基于框架的 HTML 文档. 2)  HTML 4.01 规定了三种文档类型:Strict.Transit ...

  9. 频谱分析仪 RBW&VBW

    扫频式频谱分析仪的结构如下图 RBW(Resolution Bandwidth)的影响 The RBW dictates the resolution bandwidth, which is rela ...

  10. (新人的第一篇博客)树状数组中lowbit(i)=i&(-i) 的简单文字证明

    第一次写博好激动o(≧v≦)o~~初一狗语无伦次还请多多指教   先了解树状数组http://blog.csdn.net/int64ago/article/details/7429868感觉这个前辈写 ...