0711|c基础day9(指针)

目录

一、总思维导图

        1.1 指针介绍、指针变量的定义、指针字节大小、指针定义和初始化

        1.2 *和&的使用

        1.3 指针的运算​

        1.4 值传递和地址传递​

        1.5 指针和一维数组

        1.6 指针和字符串

二、课堂练习

        2.1 指针定义和初始化

        2.2 指针实现字符串逆置

        2.3 值和地址

        2.4 封装函数,利用指针实现【冒泡(升序)、简单排序(降序)】

        2.5 ①定义一个字符数组,利用指针修改首字符的值

              ②输入一个字符数组,利用指针输入,将大写转为小写并输

三、作业

        3.1 用指针实现字符串连接

        3.2 下面的代码有什么错误?

        3.3 下面代码有什么问题?

        3.4 有什么错?

         3.5 下面是一段0-100累加和的代码,请指出这段代码中的错误


一、总思维导图

 1.1 指针介绍、指针变量的定义、指针字节大小、指针定义和初始化

 1.2 *和&的使用

 1.3 指针的运算

 

 1.4 值传递和地址传递

 值传递和地址传递(实现交换)

 

1.5 指针和一维数组

 

1.6 指针和字符串

二、课堂练习

2.1 指针定义和初始化

    //定义一个变量a,再定义一个指针p指向a的地址
    //观察a=*p=a的值、&a=p=a的地址、&p是对指针p取地址

#include <stdio.h>
int main(int argc, const char *argv[])
{
	//定义一个变量a,再定义一个指针p指向a的地址
	//观察a=*p=a的值、&a=p=a的地址、&p是对指针p取地址
	int a=100;
	int *p=&a;
	printf("a=%d   *p=%d\n",a,*p);
	printf("&a=%p  p=%p\n",&a,p);
	printf("&p=%p\n",&p);
	return 0;
}

 2.2 指针实现字符串逆置

#include <stdio.h>
int main(int argc, const char *argv[])
{
	//用指针实现字符串逆置
	char str[]="hello";
	char *p=str;//指向字符串首字符的地址
	char *q=str+strlen(str)-1;//指向字符串'\0'前的地址
	while(p<q)//循环交换
	{
		char t=*p;*p=*q;*q=t;
		p++;q--;
	}
	puts(str);
	return 0;
}

2.3 值和地址

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void fun(int *arr,int len)
{
	int *p=arr;
	int i;
	for(i=0;i<len;i++)
	{
	//  打印数组元素的值
	//	printf("%d\t",arr[i]);
	//	printf("%d\t",p[i]);
	//	printf("%d\t",*(arr+i));
	//	printf("%d\t",*(p+i));
	//	printf("%d\t",*(&arr[i]));
	//	printf("%d\t",*(&p[0]+i));
	//	printf("%d\t",*p++);

	//	打印数组元素的地址
	//  printf("%p\t",&arr[i]);
	//  printf("%p\t",arr+i);
	//  printf("%p\t",&arr[0]+i);
	//	printf("%p\t",&p[i]);
		printf("%p\t",p+i);//常用
	//  printf("%p\t",&p[0]+i);
	//  printf("%p\t",p++);
	}
}
int main(int argc, const char *argv[])
{
	//用函数利用指针输出数组各个元素的地址
	int arr[]={11,12,13,14};
	int len=sizeof(arr)/sizeof(arr[0]);
	fun(arr,len);
	
	return 0;
}

2.4 封装函数,利用指针实现【冒泡(升序)、简单排序(降序)】

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Bubble(int *p,int len)
{
	int i,j,t,count;
	for(i=1;i<len;i++)
	{
		count=0;
		for(j=0;j<len-i;j++)
		{
			if(*(p+j)>*(p+j+1))
			{
				t=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=t;
				count++;
			}
		}
		if(count==0)
		{
			break;
		}
	}
	for(i=0;i<len;i++)
	{
		printf("%d\t",*(p+i));
	}
	putchar(10);
}
void paixu(int *p,int len)
{
	int i,j,t,count,max;
	for(i=0;i<len-1;i++)
	{
		max=i;
		for(j=i+1;j<len;j++)
		{
			if(*(p+max)<*(p+j))
			{
				max=j;
			}
		}
		if(max!=i) //交换
		{
			t=*(p+max);*(p+max)=*(p+i);*(p+i)=t;
		}
	}
	for(i=0;i<len;i++)
	{
		printf("%d\t",*(p+i));
	}
	putchar(10);
}

int main(int argc, const char *argv[])
{
	//冒泡(升序)
	//简单选择(降序)
	int arr[]={5,2,7,14,36,1};
	int len=sizeof(arr)/sizeof(arr[0]);
	Bubble(arr,len);
	paixu(arr,len)	;
	return 0;
}

 2.5 ①定义一个字符数组,利用指针修改首字符的值

       ②输入一个字符数组,利用指针输入,将大写转为小写并输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
/*
    //定义一个字符数组,利用指针修改首字符的值
	char str[]="hello";
	char *p=str;
	*p='H';
	puts(str);
	puts(p);
*/
	//输入一个字符数组,利用指针输入,将大写转为小写并输出
	char str[10],i=0;
	char *q=str;
	gets(q);
	int len=strlen(q);
	while(q[i]!='\0')
	{
		if(q[i]>='A'&&q[i]<='Z')
		{
			q[i]=q[i]+32;
		}
		i++;
	}
	printf("%s\n",q);
	return 0;
}

三、作业

3.1 用指针实现字符串连接

#include <stdio.h>
void my_strcat(char *dest,char *src)
{
	int i=0,j=0;
	for(i=0;*(dest+i)!='\0';i++);
	while(*(src+j)!='\0')
	{
		*(dest+i)=*(src+j);
		i++;j++;
	}
	*(dest+i)='\0';
	puts(dest);
}
int main(int argc, const char *argv[])
{
	//指针实现字符串连接
	char s1[20]="";
	char s2[20]="";
	char *p=s1;
	char *q=s2;
	gets(s1);
	gets(s2);
	my_strcat(p,q);
	return 0;
}

 

3.2 下面的代码有什么错误?

void test()
{
        char string[10];
        char *str1="0123456789"
        strcpy(string, strl);
}

答: ①char *str1="0123456789"后没有+分号;

        ②没有添加<string.h>的头文件,无法引用strcpy;

        ③strcpy(string, strl);中的strl应为str1;

        ④string的字符长度只有10,设置的不够大。str1内的字符串长度为11,如果要将str1连接到string后,应该将string的字符长度设置大一点。如果不够大将越界。

3.3 下面代码有什么问题?

int main()
{
    char a;
    char *str = &a;
    strcpy(str,"hello")
    printf(str);
    return 0;

}

答: ①char a后面应当加   [常量表达式]   

        ②char *str应该指向a,如果指向&a,则是指向了a的地址。--->char *str=a;    

        ③应当添加头文件include <stdio.h>和include <string.h>来调用strcpy函数

        ④strcpy(str,"hello")后应加 分号    ;

        ⑤printf(str)不能输出str,可以使用puts(str)

            如果要用printf输出,应为:printf("%s",str);  

3.4 有什么错?

char* s="AAA";

printf("%s",s);

s[0]='B';

printf("%s",s);

 答:①char* s应为char *c    ;

        ②将字符串常量'AAA'赋值给指针s,字符串常量是只读的,不能修改。

 3.5 下面是一段0-100累加和的代码,请指出这段代码中的错误

int main()

{

        int* MyData;

        int Count=100;

        int Sum,i;

        for(i=0;i<Count;i++)

        {

                Sum+=*MyData;

                MyData++;

        }

        return Sum;

}

答: ①MyData没有指向存储空间,是野指针,代码在后续执行中将会发生错误,甚至死机;

        ②应当添加头文件#include <stdio.h>;

        ③没有给Sum定义初始值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值