- C
- 1. memset 初始化
- 2. sprintf
- 3.memcpy函数
- 4.exit退出函数
- 5. continue与break
- .指针与数组
- switch
- 转义字符
- 高级点的函数应用
- 伪随机数
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”);
memcpy(d, s+11, 6);
表示从 s[11] 字符开始复制6个给d
#include
exit(0);
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)
{
intp;
最后得出结果result;
把结果地址给函数来返回;
p=&result;
return p;
}
10.6指针数组做main函数的参数
main函数称为主函数,是所有程序的运行入口
switchswitch(key) { case 1: { } case 2:xx;break; case 3:xxx;break; default break; }
当你的数据case是比较多的代码时,你要用大括号把它给括起来
相比起大括号,你把它封装为一个函数岂不是很不错
另外的话…在switch里面时不可以第一变量的
好比for(int i=0;i<10;i++)
但是在switch里面是不可以这么干的,不能重新定义一个变量
- "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"); }
每一次运行的随机数是不一样的…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)