吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2659|回复: 15
收起左侧

[其他转载] C 语言 学习第二弹

  [复制链接]
hack_hu 发表于 2018-11-20 17:36
本帖最后由 hack_hu 于 2018-11-20 17:37 编辑

正文共: 2745字
预计阅读时间: 7分钟

递归函数 : 不断的调用函数本身。 ( 注: 为防止无限递归,所有的递归函数都需要一定的终止条件 )static 修饰词 :变量前面加上修饰词  static 表示变量具有静态存储期限, 而不再是自动存储期限。  因此,静态变量在程序的执行期间拥有永远的存储单元, 程序运行一直保留静态变量的值。 静态方法也是一样, 所以在 C 语言和 C# 中不能随意使用静态方法, 这样会占用大量的系统内存, 在大型项目中尤为注意!当数组初始化比数组本身短时, 余下数组元素会初始化为 0 . 例 : int num[10] = { 1,2,3,4 }; 数组剩余的6个元素会自动初始化为 0 , 字符数组中会将剩余元素初始化 空字符串 '\0' 。指针C语言支持 , 且只支持 3 种格式的指针算术运算    1、 指针加整数。 实际上是对指针所指向的内存地址 ( 整数 ) 进行操作    2、 指针减去整数。 同理指针加整数, 是对内存地址进行操作。    3、 两个指针相减。 是两个指针所指向的值进行操作, 只有当两个指针指向同一个数组时, 指针相减才有意义。
/*结合数组观察 C 语言指针的算术运算*/


int a[5] = {1,2,6,4,5};
int *q = &a[0];
q = q + 2;//此时 指针 q 指向的是 a[2]的地址
printf("指针加整数 : q + 2 = %d\n",*q);
q = q - 1;//此时 指针 q 指向的是 a[1]的地址
printf("指针减整数 : q - 1 = %d\n",*q);
int *q2 = &a[4];
*q2 = q2 - q;//这里是一个具体的值
printf("指针减指针 ; q2 - q = %d\n", *q2);
printf("%d , %d",*q2++,++*q2);// *q++ 是将 q2的值+1, 而 *q2++ 是把 指针q2 指向的地址 +1
指针赋值例 : int *p , *q ; p = q; 意为 使指针 p 指向 指针 q 所指向的内存单元, 两个指针最终指向同一地址 , 而  *p = *q 意为将 指针 q 指向的内存单元的值 复制给 指针 p , 二者所指向的内存地址并不一样。/* *p=*q 与 p=q 的区别 */
int a=9,b=6,*q,*p;
q = &a;
p = &b;
*p = *q;// 实际上是将 a 的值复制给了 b
printf("*q = %d ,*p = %d,b = %d\n",*q,*p,b);//此时输出 *q = 9 ,*p = 9,b = 9
b = 7;
printf("*q = %d ,*p = %d,b = %d\n", *q, *p, b);//此时输出 *q = 9 ,*p = 7,b = 7
p = q;//两者都将指向 a 的地址
a = 3;
b = 4;
printf("*q = %d ,*p = %d,a = %d, b = %d\n", *q, *p,a, b);// 此时输出*q = 3 ,*p = 3,a = 3, b = 4,对 a的操作会影响 q 和 p 两个指针


C语言按照主序存储二维数组, 先从第 0 行元素开始。 举例说明 int num[5] = { 1,2,3,4,5 }; 若 num[0] 存储在内存地址 10001 则 数组中剩余元素依序连续往下排列 , num[4] 内存存储地址则为10005 。( 假设每个 int 类型整数占用的内存空间是 1) 。 实际程序运行中 , 只会记录数组的第一个元素地址、以及内存长度。 该理论适应于 C 语言中的多维数组, 以及字符串存储( 字符数组 )。 正是因为数组的这种存储方式, C 语言程序设计中数组和指针总是配合使用。


/* 用指针进行数组循环累加 */
int *p, a[N] ,sum=0,n;
printf(" 你想要输入几个数 :  ");
scanf("%d",&n);
printf("\n请依次输入\n");
for (int i = 0; i < n; i++)
{
scanf("%d",&a);
}
p = &a[0];
while (p<&a[5])//指针可以进行比较,但是只限于同一数组
{
sum += *p++;//指针每次指向数组中的下一个元素
}
printf("%d\n",sum);

总结 :在指针的运用中搞清楚什么时候指向的是地址, 什么时候指向的是值可以让你更清楚的明白代码的含义。刚开始接触指针, 还有很多概念未熟悉后续会对指针进行更深入的总结。 ( 待续 )字符串C 语言中并没有直接声明的 字符串类型 ( 类似 C# 中的 string 类型 ),但是可以用 char 数组存储字符串char str[] = "用字符数组存储字符串";


从本质而言, C 语言把字符串变量作为字符串数组处理, 当 C 语言编译器在程序中遇到长度为 n 的字符串字面量时, 他会为字符串字面量分配长度为 n+1 的内存空间。 这块内存空间将用来存储字符串字面量中的字符, 以及一个用来标志字符串末尾的额外字符 ‘ \0’( 空字符,存储在内存地址中 0 的位置 )。 例 : char str[5] = "1234"; 通常会如此定义字符串, 给空字符串预留位置, 有利于安全的读取、 存储 字符串。


#include <stdio.h>
int main()
{
/* 用指针实现 strlen 和 strcat 两个函数 */
int _strlen(const char *p);
char *s(char *p, const char *str);
char str[10] = "abcdef";
char str2[] = "123";
printf("%d\n",_strlen(str));
s(str, str2);
printf("%s\n",str);
return 0;
}
int _strlen(const char *p)
{
const char *q = p;//这里需要加上 const 表明不修改指针 p所指向的内存单元
while (*p != '\0')//这里也可以 写成 *q!=0; 因为 空字符 '\0' 指向的就是 地址 0
   p++;
return p - q;
}
char *s(char *p,const char *str)
{
char *q = p;
while (*q)
   q++;
while (*q++ = *str++)// while 表达式会测试赋值表达式的值, 当指针 q 和 str 指向 空字符时循环结束
   ;
//*q = '\0';
return p;
}


改变字符串字面量会导致程序崩溃或运行不稳定! 通常编译器会报错禁止我们修改字符串字面量。C 语言中声明里的  ' = ' 号 代表的是初始化的意思 , 而其他地方进行 算术运算的 ' = ' 号代表的是赋值的意思。int num[] = { 1,2,3 }, *p = num;//声明中 '=' 的特殊性
单个的字符和只有一个字符的字符串具有不同含义。 例 ‘a’ 和 “a” 在程序中含义完全不同 ,字符‘a’ 在内存中以整数( 字符集数字码, ASCII 码) 形式存储表示, 而“ a”以指针形式表示, 该指针指向存放 字符 ‘a’的内存地址。C 语言 string.h 字符串库中 提供了 两个常见的字符串复制、拼接字符串函数 strcpy 、 strcat。 还有两个功能类似的函数 strncpy 、 strncat 后两者相对来说处理速度较慢但是安全系数更高, 并且可以限制 复制、拼接的字符串长度从而避免超出目标字符数组的长度。

重新学习 C 语言欢迎交流,你的评论、点赞是对我最好的支持
C-Part2.png

免费评分

参与人数 6吾爱币 +5 热心值 +6 收起 理由
慕白1030 + 1 + 1 我很赞同!
吾爱姚吕婧妍 + 1 我很赞同!
xhushidai + 1 + 1 我很赞同!
qetuo + 1 + 1 我很赞同!
TQhql + 1 + 1 我很赞同!
wx3002 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hack_hu 发表于 2018-11-21 08:40
吾爱姚吕婧妍 发表于 2018-11-20 21:40
看见了不好意思 尴尬 呀 眼睛疼

可以推荐你们一本书 《 C 语言程序设计 现代方法 》这是我现在看的一本, 非常适合新手观看
吾爱姚吕婧妍 发表于 2018-11-21 21:04
本帖最后由 吾爱姚吕婧妍 于 2018-11-21 21:11 编辑
hack_hu 发表于 2018-11-21 08:40
可以推荐你们一本书 《 C 语言程序设计 现代方法 》这是我现在看的一本, 非常适合新手观看

好的 谢谢楼主
xjh88232259 发表于 2018-11-20 17:54
云梦墨溪 发表于 2018-11-20 18:13
谢谢分享
wws1230 发表于 2018-11-20 19:00
什么东东  先学习学习
安699 发表于 2018-11-20 19:30
看看如何 !
Towneast 发表于 2018-11-20 19:40
重新来学习下
五二 发表于 2018-11-20 20:28
感谢分享~
吾爱姚吕婧妍 发表于 2018-11-20 21:40
看见了不好意思 尴尬 呀 眼睛疼
qetuo 发表于 2018-11-20 21:41
先学习学习
吾爱姚吕婧妍 发表于 2018-11-20 21:44
算我贪心了 希望楼主多多分享一点心得体会
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 22:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表