首页 > 其他分享 >C语言基础总结

C语言基础总结

时间:2023-07-16 23:11:48浏览次数:33  
标签:总结 p1 struct int 基础 C语言 v1 printf next

C语言基础

单独讲的C语言。目前与安卓、Java毫无关系。

1.1 编译器

  • 在你自己电脑上安装相关语言的编译器:Visual C++、GCC

    mac,默认clang(mac用户自带C编译器),如果没有就去直接安装xcode。
    	 xcode:https://developer.apple.com/xcode/
    
    win,MinGV
    	https://www.cnblogs.com/longxinyv/p/12309561.html
    
  • 学习编程语法: main.c

    # include <stdio.h>
    
    int main(int argc, char const *argv[]) {
        printf("hello world");
        return 0;
    }
    

在终端:

>>>gcc main.c 
>>>./a.out

1.2 IDE

快速编写C代码。

1.3 运行

1.4 常见类型和功能

1.4.1 字符串相关

在C语言中没有字符串。

用字符数组创造出字符串出来(每个字符占1个字节)。

#include <stdio.h>

int main() {

    char v1 = 'w';

    char v2[4] = {'w', 'u', 'p', '\0'};

    char v3[] = "wupeiqi";

    char v4[] = "武沛齐";  // x1 x2 x3

    printf("Hello, World!\n");

    return 0;
}

对于数组来说,内部元素是挨个存放,内存地址相邻。

#include <stdio.h>

int main() {

    char v1[8] = {'w', 'u', 'p', 'e', 'i', 'q', 'i', '\0'};
    char v3[] = "wupeiqi";
    
    printf("第0个位置值:%c,内存地址:%p \n", v3[0], &v3[0]);
    printf("第0个位置值:%c,内存地址:%p \n", v3[1], &v3[1]);
    printf("第0个位置值:%c,内存地址:%p \n", v3[2], &v3[2]);

    return 0;
}

1.4.2 整数相关

  • short 2字节
  • int 4字节
  • long 8字节
#include <stdio.h>

int main() {

    short v1 = 12;
    printf("长度:%lu", sizeof(v1));

    return 0;
}

1.4.3 指针

int v1 = 666;

int* v2 = &v1;   // 取地址符,得到是指针。
#include <stdio.h>

int main() {

    int v1 = 666;
    int *v2 = &v1;


    printf("v1对应的值:%d,内存地址是:%p \n", v1, &v1);
    printf("v1对应的值:%p,内存地址是:%p \n", v2, &v2);

    return 0;
}
v1对应的值:666,内存地址是:0x7ff7b3d08678 
v1对应的值:0x7ff7b3d08678,内存地址是:0x7ff7b3d08670 

示例1:

#include <stdio.h>

int main() {

    char v1 = 'x';
    char* v2 = &v1;


    printf("v1对应的值:%c,内存地址是:%p \n", v1, &v1);
    printf("v1对应的值:%p,内存地址是:%p \n", v2, &v2);

    return 0;
}

v1对应的值:x,内存地址是:0x7ff7b45e567b 
v1对应的值:0x7ff7b45e567b,内存地址是:0x7ff7b45e5670 

示例2:

int v1 = 666;
int* v2 = &v1;

如果你有一个指针类型的变量v2,内部存储肯定是内存地址,如何获取次内存地址中存储的值呢?
int v3 = *v2;

注意:&变量,获取变量指向数据的内存地址。*变量,根据变量中存储的内存地址去获取次内存地址中存储的值。

示例3:

#include <stdio.h>

int main() {

    int v1 = 666;
    int *v2 = &v1;
    int *v3 = &v1;

    v1 = 999;

    printf("v2指针关联的值:%d \n", *v2);
    printf("v3指针关联的值:%d \n", *v3);

    return 0;
}

示例4:

#include <stdio.h>


int main() {
    int v1 = 666;
    v1 = 999;
    printf("v1的值是%d\n", v1); // 999
    return 0;
}

以后在分析别人的C语言代码时,你一定要当心。

v1 = 123;
doEncrypt(&v1);  

# 后面v1的值很可能已经发生变化了。
v1 = 123;
doEncrypt(v1);  

# v1一定还是123

1.4.4 指针的指针

白话指针,内部存储了一个别人的数据的内存地址。

int v1 = 666;

int* v2 = &v1;

int* v3 = &v1;

int** v4 = &v2;  // 指针的指针

int*** v5 = &v4;  // 指针的指针

本质上,指针其实就是咱们说的根据内存地址对数据进行操作。

#### 1.4.5 结构体

表示一组数据,利用结构体来实现。

```c
#include <stdio.h>

struct Person {
** char n**ame[30];
int age;
};

int main() {
struct Person v1 = {"alex", 18};
struct Person v2 = {"路飞学城", 3};
struct Person v3 = {"李杰", 31};

printf("值是:%s", v1.name);
return 0;

}


```c
#include <stdio.h>

struct Person {
    char name[30];
    int age;
};


int main() {

    struct Person v1 = {"alex", 18};
    printf("值是:%s \n", v1.name);

    struct Person *pp = &v1;  // pp是一个变量,他是一个指针类型。 *pp
    printf("值是:%s \n", (*pp).name);
    printf("值是:%s \n", pp->name);
    
    return 0;
}

扩展:

- Python解释器,是有C编写的。
- 在Python中创建了
	v1 = [11,22]      ->   结构体 {size:2,item:[11的内存地址,22的内存地址], 引用计数器:2 }
	v2 = v1
	
	v2 = 123
	v3 = "武沛齐"
单向链表

struct Node
{
    int data;
    struct Node *next;
}

struct Node v3 = {33};
struct Node v2 = {22, &v3};
struct Node v1 = {11, &v2};


v1.data;        		// 11
v1.next->data;   		// 22
v1.next->next->data;    // 33
# include <stdio.h>

struct Person
{
    int data;
    struct Person *next;
};

int main(int argc, char const *argv[])
{   
    struct Person p3 = { 33 };
    struct Person p2 = { 22, &p3 };
    struct Person p1 = { 11, &p2 };
    
    printf("p1的值: %d\n", p1.data);
    printf("p2的值: %d\n", p1.next->data);
    printf("p3的值: %d\n", p1.next->next->data);

    return 0;
}

注意:将数组时,里面的每个元素都是连续的;构造一个动态的容器。

双向链表

# include <stdio.h>

struct Person
{
    int data;
    struct Person *next;
    struct Person *prev;
};

int main()
{   
    struct Person p3 = { 33 };
    struct Person p2 = { 22 };
    struct Person p1 = { 11 };
    p1.next = &p2;

    p2.next = &p3;
    p2.prev = &p1;

    p3.prev = &p2;

    printf("p1的值: %d\n", p1.data);
    printf("p2的值: %d\n", p1.next->data);
    printf("p3的值: %d\n", p1.next->next->data);

    printf("p3的值: %d\n", p3.data);
    printf("p2的值: %d\n", p3.prev->data);
    printf("p1的值: %d\n", p3.prev->prev->data);

    return 0;
}
双向环状链表

```c
# include <stdio.h>

struct Person
{
** int data;**
** struct Person next;*
** struct Person prev;*
};

int main()
{
struct Person p3 = { 33 };
struct Person p2 = { 22 };
struct Person p1 = { 11 };
p1.next = &p2;
p1.prev = &p3;

p2.next = &p3;
p2.prev = &p1;

p3.prev = &p2;
p3.next = &p1;

printf("p1的值: %d\n", p1.data);
printf("p2的值: %d\n", p1.next->data);
printf("p3的值: %d\n", p1.next->next->data);

printf("p1的值: %d\n", p1.next->next->next->data);
printf("p2的值: %d\n", p1.next->next->next->next->data);
printf("p3的值: %d\n", p1.next->next->next->next->next->data);

return 0;

}




#### 1.4.6 预处理和头文件

 预处理,在程序编译之前会先运行的。

include <stdio.h>

include "utils.h"

define ME 999

int main() {

int data = ME + 100;
printf(VAL);

return 0;

}

标签:总结,p1,struct,int,基础,C语言,v1,printf,next
From: https://www.cnblogs.com/huxiaofeng1029/p/17558807.html

相关文章

  • 【DP】01背包与完全背包总结及空间优化
    01背包问题​ 题目描述:有n件物品,每件物品的重量为w[i],价值为c[i]。现在有一个容量为V的背包,问怎么选取物品放入背包,能使得背包内的总价值最大。其中每件物品只能放入一次。​ 样例:n=5,V=8w[i]=3,5,1,2,2c[i]=4,5,2,1,3​ 分析:使用暴力的解法,每件物品分为放......
  • vue-day25--自定义指令总结
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>自定义指令总结</title><scriptt......
  • Typescript学习笔记总结
    Typescript是一种由微软开发的开源编程语言,它是JavaScript的超集,意味着它包含了JavaScript的所有特性,同时还提供了一些额外的功能和类型检查。Typescript的目标是提高JavaScript代码的可读性、可维护性和可扩展性,同时还能够在编译时检测出一些常见的错误。在本文中,我们将详细介绍Ty......
  • 7.16总结
    昨晚睡得很早,起床后头疼的症状也缓解了,然后起床在床上刷了会视频,起来后将pta弄到了1500分,上午还有人问我题,我就讲了一下,这对我来说也是复习提升吧。中午自己炒了个菜,手法很生疏,做的很失败,但也能吃,吃完之后刷视频,看了一会javaweb知识,更新了sql的笔记,快整理完了,整理的也是简单的常用......
  • 每日总结2023年7月16日
    今日学习:批处理的学习;java连接池C3P0的连接。遇到的问题:今天在做批处理的时候发现一个问题,就是我的MySQL数据表好像只能存储1000条数据,那么如果数据量远大于此我该如何解决?明天的计划:开启Spring学习。......
  • 第一一周每周总结
    第一周:学习基础知识和概念在第一周的学习中,我着重探索了大数据技术的基本知识和概念。首先,我了解了大数据的定义和特点。我理解到大数据不仅仅是指数据量庞大,还包括数据的多样性、速度和价值。我开始思考大数据是如何改变传统数据处理和分析方法的,并对其在各行各业中的应用进行了......
  • 7.15晚模拟赛总结
    暑假第一次模拟赛  先开T1,发现样例看不懂(后来发现是题目的样例解释写错了)自信打开T2,发现没有任何思路(赛后听mhd大佬说了人类智慧双指针,茅厕顿开!!),又跳过T3,发现坐过原题,但是只记得一点点思路了,后悔ING了十几分钟后开始打,打炸了,调了好久才过样例,结果是有致命思路错误,只有20ptsT4......
  • 网络流阶段性总结
    网络流,一种建图的艺术显然我没有那种艺术细胞(悲$\$最大流dinic+当前弧优化$\$P1231教辅的组成对于书本的点数,要控制经过点的流量因此拆点#include<bits/stdc++.h>usingnamespacestd;constintN=4e4+10,M=1e5+10,inf=1e9;intn1,n2,n3,m1,m2,s,t;intcur[N]......
  • C语言宏定义中的#和##
    #和##是宏定义中常用的两个预处理运算符其中#用于记号串化,##用于记号黏结,下面分别介绍它们。1.记号串化(#)记号串化可以将函数式宏定义中的实参转换为字符串。在函数式宏定义中,如果替换列表中有“#”,则其后的预处理记号必须是当前宏的形参。在预处理期间,“#”连同它后面的形参一起......
  • 暑假第一周总结
    周一:今天没有学习,在家玩了一天周二:今天看网课复习了一下python周三:今天进行python环境配置周四:今天玩了一天,没有学习。周五:今天进行数据库的连接。周六:今天继续连接数据库又看了一下爬虫的概念周日:今天玩了一天没有学习。......