今日思维导图:
补充:
i)bzero(只针对字符数组)
参数:void bzero(void *s, size_t n )
| |
内存起始地址 置多大空间
功能:内存置0,n字节(使用bzero函数实现内存置0)
ii)memset(通常用于,非字符数据置0)
void*memset(void *s, int c,size_t n )
|
把s置位什么内容
#include <stdio.h>
#include<string.h>
int main(int argc,const char *argv[])
{
int a[10]={0};
int i;
memset(a,1,4);//从a的起始地址开始 后面四个字节全置为1
for(i=0;i<10;i++)
{
printf("%#x\n",a[i]);
}
return 0;
}
iii)goto跳转
【1】goto的基本使用
goto的本质是代码跳转,也可以用它实现循环,只能在同一个函数中跳转。
尽量不要在代码中使用goto,降低代码的可读性
语句块1
goto NEXT;//NEXT就是一个标签
语句块2;
语句块3;
NEXT:
语句块4
执行逻辑:
先执行语句块1
接着走到goto,跳转到goto后面的标签,先执行语句块4
iv)do while循环
do
{
循环体;
}while(条件);
先执行循环体语句,再判断条件是否成立。
do while语句不管条件是否满足,循环体内语句都会执行一次。
c语言可以操作内存
一,指针
scanf(“%d”,&a); //用到了a的地址
通过变量名访问变量,是直接访问。
指针实际上是内存地址/内存编号,平时我们说的指针指的是保存内存地址的变量
【1】定义
存储类型 数据类型 * 变量名
指针保存的是变量的首地址
//int *p p变量名 int *
//int arr[4] arr变量名 int[4]
//char str[5] str变量名 char [5]
//int a a变量名 整形
#include <stdio.h>
int main(int argc,const char *argv[])
{
int *p2,*p1,temp;
int a=100;
int b=90;
p1=&a;
p2=&b;
temp=*p2;
*p2=*p1;
*p1=temp;
printf("%d\t%d\n",a,b);
return 0;
}
*的含义
1.*在定义指针变量时,标识定义了一个指针变量。
2.*p 表示的是访问地址中的数据,解引用。(*前面是否有数据类型)
&的含义
1.取变量的地址
2.&按位与,位运算
【2】指针的初始化和赋值
#include <stdio.h>
int main(int argc,const char *argv[])
{
int a=100;
int *p; //只定义不初始化,是一个野指针
int *p1=&a; //定义了一个指针变量p1并让他指向变量a
int *p2=NULL;//空指针
int b=90;
p=&b;//给指针变量赋值,让指针变量p1指向b的地址
printf("%d\n",a);
printf("%p\n",&a);
printf("%p\n",p1)
printf("%d\n",p2);//空指针的间接访问一定会段错误
//通过指针变量p1,操作a
*p1=10;
printf("%d\n",a);
return 0;
}
野指针对程序而言是有害的,尽量不要定义野指针,不知道指向哪里,指向空指针
【3】指针变量的大小
指针变量的大小,只和操作系统有关和数据类型无关
指针的数据类型决定了指针+1,-1向后或者向前偏移的大小
64位8Byte,32位4Byte
【4】指针的运算
算术运算和关系运算是有意义的。
关系运算,它通常用来判断同一片空间
【5】大小端存储
小端存储:数据低位放地址低位,日常使用的计算机都是小端存储
大端存储:数据低位放地址高位,TCP/IP/通信
#include <stdio.h>
int main(int argc,const char *argv[])
{
int a=0x12345678;
char *p=&a;
printf("%#x\n",*p); //0x78小端存储
//判断大小端
if(*p==0x78)
{
printf("小端存储\n");
}else
{
printf("大端存储\n");
}
return 0;
}
【6】指针和一维数组
一维数组通过指针输入输出
#include <stdio.h>
int main(int argc,const char *argv[])
{
int a[5];
int *p=a;
int i;
for(i=0;i<=4;i++)
{
scanf("%d",p+i);
}
for(i=0;i<=4;i++)
{
printf("%d\n",*(p+i));
}
return 0;
}
作业
1.使用指针实现冒泡排序
#include <stdio.h>
int main(int argc,const char *argv[])
{
int a[]={10,3,32,6,8,39,22,11};
int len=sizeof(a)/sizeof(a[0]);
int *p=a,i,j,temp,count;
for(i=1;i<=len-1;i++)
{
count=0;
for(j=0;j<=len-i;j++)
{
if(*(p+j-1)>*(p+j))
{
temp=*(p+j);
*(p+j)=*(p+j-1);
*(p+j-1)=temp;
count++;
}
}
if(count==0)
break;
}
for(i=0;i<len;i++)
{
printf("%d\n",*(p+i));
}
return 0;
}
2.试着输出字符数组
#include <stdio.h>
int main(int argc,const char *argv[])
{
char a[5];
char *p=a;
int i;
for(i=1;i<=5;i++)
scanf("%c",p++);
p=a;
for(i=1;i<=5;i++)
printf("%c\n",*(p++));
return 0;
}