目录
1.1 指针介绍、指针变量的定义、指针字节大小、指针定义和初始化
2.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定义初始值。