C-语言学习

C-语言学习,第1张

C-语言学习

对C语言一见钟情
  • C
    • 1. memset 初始化
    • 2. sprintf
    • 3.memcpy函数
    • 4.exit退出函数
    • 5. continue与break
    • .指针与数组
    • switch
    • 转义字符
  • 高级点的函数应用
    • 伪随机数

C 1. memset 初始化

memset(Buffer, 0, sizeof(Buffer));
memset对Buufer从第[0]开始把数字’ 0’ 复制sizeof(Buffer)个长度给Buffe

注意这里单位长度sizeof(Buffer), 比如一个int 4字节

2. sprintf

衔接字符串

sprintf(Buffer, “%s%02X”, Buffer, a[i] ^ b[j]);"%s=Buffer,%02X=a[i] ^ b[j]"
sprintf(str, “%s world!”, “hello”);

3.memcpy函数

memcpy(d, s+11, 6);
表示从 s[11] 字符开始复制6个给d

4.exit退出函数

#include
exit(0);

5. continue与break

contiune是满足条件不再执行他之后的语句

break 是直接跳出循环,不管它之后有没有东西…

有时候bbreak与continue的作用是一样的

.指针数组

指针-乱讲

10.1.1地址与指针

指针就是所指向变量的地址,我们要通过调用地址来访问指定内存的储存单元 eg:如房间编号5008指向寝室的4个sb 房间的指针就是门牌号

简而言之,指针就是地址

变量i,指针p

p是i的房间编号,通过p我们知道i里面有啥子鬼

一个int有4字节,char有1字节 eg 1一个房间装4或1个人

10.1.2变量与指针

对变量的存取是通过地址实现的

10.1.3指针变量

类型 * 变量名 专门用来放地址的变量类型,指针变量类型

指针变量的赋值 &x 地址运算符,表示x的房间编号 eg int p=&x 指针运算符, 表示访问指向的房间 eg printf("%d", p); 当赋值运算 p=&x,时 我们可以同时用2者访问同一个房间 房间绝不是简单的一个int型编码,而是指针类型的数字编码 ---->问题,可不可以 *p=8; 注意&*P表示取p指向元素的地址

指针变量的引用

int *p , q 只是表示p是指针,而 q 是 int 变量

10.1.4 指针的加减

int*p,arr[5]

p=arr;

p+i 或者a+i 表示&a[i]数组元素的地址

*(p+i)或者 *(a+i) 表示a[i]数组的元素

指针的递增递减

p++就是指向下一个房间的门牌号

*p++就是 *(p++), 表示指向下一个房间的元素

*p-- 同上;

p–同上;

—>注意 , p++ 后,指针值会发生改变,即门牌号发生了改变,如果还要从头开始访问,要重新回到最初的门牌号

10.2.1一维数组与指针

数组名表示首地址

int *p , arr[7];

p=arr;

p=&arr[0];

10.2.2二维数组与指针

二维数组是一维数组 以直化曲

在a [x] [y] 数组中相关概率的混淆

地址混淆篇

a默认为a [0] [0]的地址, 没有解维

它后面可以跟着2个索引

跟一个索引 a+x 表示 a [x] [0]的地址

跟2个索引 [ * [a+x]+y ] 表示即 a [x] [y]的地址

同上,有…

*a , 此刻已解开1个维,默认a[0] 的地址, 故a[0]也表示 * a的地址 未接索引时默认& a[0] [0] 只能接1个索引, 即 ( *a)[x] 表示& a[0] [x]的地址

同理a[x]表示 未接索引的a[x] [0] 接了索引时( * a [x] ) [y]表示a [x] [y]

&a[4] 也可以接2个索引

( &a[4] ) [x] [y]表示 a[4+x] [y]

只能接1个索引的, +1表示指向写一个邻近的地址

可以接2个索引的,+1表示指向性下一行的地址

元素值混淆篇

表示a[x] [y]元素

*( *(a+x)+y )

*( a[x] + y )

*(&a [x] [y]) 其中 &a 默认&a[0]

*( *(a+x) ) [y]

注意, a[0]已 表示解维, &a[1]中a[0]解维后&又加维 [ * [a+x]+y ] 中,a+x没有解维,只是在一维上运算,要转到二维去加y

10.2.3字符串与指针

疑惑

char s[]={“hello,i am coming”};
char *p=NULL;
p=s;
printf("%sn",p);它会从第一个地址往后一直取
printf("%cn",p);
printf("%cn",
++p);
疑惑

char* str=“hello,i am a-xiang”;
//指针地址可以是字符串吗?好比地址是000020x,可以是zfcswdi吗…这可能使地址不连续
printf("%s",str);//它会从开始一直取到末尾
printf("%s",&str[5]);//它会从第6位开始一直取到末尾
10.2.4 字符串数组与指针-指针数组

数组里面放的是指针,本质数组,元素是char指针好比这句话

char* str=“hello,i am a-xiang”,
于是

char *arr[100]={“hello”,"i am ",“a-xiang”};
//直接已arr[i]访问其中的元素
10.3 指向指针的指针–二级指针

类型 ** 指针名字

int ** p;
如何访问它?破壳

int *(*p)
注意啦 *地址运算符是访问所在地址指向的元素

二级指针有个啥用? 可能就是把数据打包吧,就像酒店对房间进行有序化管理的输入输出

10.4 指针变量作为函数参数

脱离不了指针的本质

函数调用时,实参与形参的数据传递方向是单向的, 指针变量作函数也是如此, 调用函数不可能改变实参指针变量的值,但可以改变实参指针所指向变量的值

指针数组

数组字数组,数组里面放地址

int var[] = {10, 100, 200};
int i, *ptr[MAX];

for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i];
}
for ( i = 0; i < MAX; i++)
{
printf(“Value of var[%d] = %dn”, i, *ptr[i] );
} 要ptr输出得赋地址和给它

字符串指针数组,数组里面放字符串,

直接当数组用,不过它还附带地址

char str[]={“hello”,“a i am “,“a-xiang”};
printf(”%s”,str[2]); 不用赋地址,直接访问,还不用
运算符
数组指针,指针里面放元素,不太了解它

int (*a)[3];
估计a会指向应该二维数组
这样理解它,它就是一个数组
int (*a)[3]表示a[0][0]之后的3个元素相应的地址
(*a)[3]表示a[0][3]首行第3个的地址
a后面会加减,就可以实现数组地址的遍历
小括号让a与 * 结合,表示 a 是一个指针,这个指针指向了一个数组,数组中有 3 个元素,每一个元素的类型是 int 型。

10.5 返回指针值的函数

int f(int x, int y)
{
int
p;
最后得出结果result;
把结果地址给函数来返回;
p=&result;
return p;
}
10.6指针数组做main函数的参数

main函数称为主函数,是所有程序的运行入口

switch
switch(key)
{
	case 1:
		{

		}
	case 2:xx;break;
	case 3:xxx;break;
	default 
		break;
}

当你的数据case是比较多的代码时,你要用大括号把它给括起来
相比起大括号,你把它封装为一个函数岂不是很不错
另外的话…在switch里面时不可以第一变量的
好比for(int i=0;i<10;i++)
但是在switch里面是不可以这么干的,不能重新定义一个变量

转义字符
  1. "t"可以把2个字符间隔8个字节
高级点的函数应用 伪随机数

其实就针对我们C语言写的那些随机数…其实都是有规律的…只不过周期很大…你找不出规律罢了

关于随机数,我们涉及一些预备知识

头文件

#include可能会用,引出时间函数,用于播种
#include

随机种子seed,随便一个名字罢了

时间函数

time()

我们都知道数组会有一个索引
好比My_Arr[index]那个index就是索引,为了对比随机数,我们把index称之为seed种子

所以你在调用随机数时,你可以可给它一个种子…去线性的种出一些看似随机的数字…其实这些随机的数都是通过一些算法实现的…一组随机数对应一个种子

当你不给seed种子初始化时,它默认种子是1
怎么初始化种子seed?

srand(seed)函数

这个seed是你自己定义的变量…你可以自己初始化

代码

#include 
#include 
int main()
{
	srand(0);
	for(int i=0;i<10;i++)
		printf("%d, ",rand()%100);//把随机数范围控制在100以内
	puts("hello");
	system("pause");
    return 0;
}

运行一下上面的代码…你会发现每一次运行的随机数都是一样的,你说假不假哎…
如何做得有那么像一点随机数?
那么你的seed种子就得是不同的?
如何不同?
没错…计算机的时间每分每秒都在发生变化…你可以把计算机的时间作为参数传递给种子

上代码

#include 
#include 
#include 
 
int main ()
{
	srand ((unsigned)time(NULL));
	for(int i=0;i<10;i++)
		printf("%d",rand()%10);
	system("pause");
}

每一次运行的随机数是不一样的…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5692795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存