Day 8 指针

今日思维导图:

补充:

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值