一、Xmind整理:
二、课上练习:
练习1:实现字符串逆置
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char str[]="hello";
char *p=str;
char *q=str+strlen(str)-1;
while(p<q)
{
char t=*p;
*p=*q;
*q=t;
p++;
q--;
}
puts(str);
return 0;
}
练习2:值传递
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void fun(int a)
{
printf("a=%d\n",a);
}
void fun_p(int *p)
{
printf("p=%p\n",p);
}
int main(int argc, const char *argv[])
{
int a=100;
int arr[]={11,22,33};
int *p=&a;//p=&a *p=a
fun(a);
fun(arr[0]);
fun(*p);
fun_p(&a);
fun_p(arr);
fun_p(p);
return 0;
}
练习3: 指针和一维数组
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void fun(int *arr,int len)
{
int *p=arr;
for(int i=0;i<len;i++)
{
// printf("arr[%d]=%d\n",i,arr[i]);
// printf("%d ",*(arr+i));
// printf("%d ",*(&arr[0]+i));
// printf("arr[%d]=%d\n",i,p[i]);
// printf("%d ",*(p+i));
// printf("%d ",*(&p[0]+i));
// printf("%d ",*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,22,33,44};
int len=sizeof(arr)/sizeof(arr[0]);
fun(arr,len);
return 0;
}
练习4:使用指针实现冒泡排序、简单选择排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Bubble(int *p,int n)
{
for(int i=1;i<n;i++)
{
int count=0;
for(int j=0;j<n-i;j++)
{
if(*(p+j)>*(p+j+1))
{
int t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
count++;
}
}
if(count==0)
break;
}
for(int i=0;i<n;i++)
{
printf("%d\t",p[i]);
}
printf("\n");
}
void Sort(int *q,int n)
{
for(int i=0;i<n-1;i++)
{
int max=i;
for(int j=i+1;j<n;j++)
{
if(*(q+max)<*(q+j))
{
max=j;
}
}
if(max!=i)
{
int t=*(q+max);
*(q+max)=*(q+i);
*(q+i)=t;
}
}
for(int i=0;i<n;i++)
{
printf("%d\t",*(q+i));
}
printf("\n");
}
int main(int argc, const char *argv[])
{
int m,n;
printf("请问你要输入一个几位数组:");
scanf("%d",&n);
int arr[n];
for(m=0;m<n;m++)
{
printf("请输入第%d个数:",m+1);
scanf("%d",&arr[m]);
}
Bubble(arr,n);
Sort(arr,n);
return 0;
}
练习5:指针指向字符数组的地址
int main(int argc, const char *argv[])
{
char str[]="hello";//str在栈区,字符串"hello"在只读区,
//把字符串常量复制一份给str
char *p=str;//p=str //p内存在栈区,p指向栈区str首地址
*p='H';
//正确,p修改栈区的内容
puts(str);
puts(p);
}
练习6: 定义数组str,指针p,通过p指向str
通过指针实现输入
通过指针把大小转换小写
通过指针实现输出
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char str[20];
char *p=str;
printf("please enter p:");
gets(p);
for(int i=0;i<strlen(p);i++)
{
if(*(p+i)>='a'&&*(p+i)<='z')//if(str[i]>='a'&&str[i]<='z')
{
*(p+i)-=32;
}
}
printf("%s\n",p);
return 0;
}
练习7:实现字符串连接
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void my_strcat(char *dest,char *src)
{
int i=0;
for(i=0;*(dest+i)!='\0';i++);
for(int j=0;*(src+j)!='\0';j++)
{
*(dest+i++)=*(src+j);
}
*(dest+i)='\0';
}
int main(int argc, const char *argv[])
{
char dest[20]="das";
char src[20]="ewew";
my_strcat(dest,src);
puts(dest);
return 0;
}
三、课后作业:
1.下面的代码有什么错误
void test()
{
char string[10];
char *str1="0123456789";
strcpy(string,str1);
}
答:这里声明的是一个字符串长度为10的数组,但"0123456789"的长度为11,在将str1拷贝 至string时,会导致数组越界。
①当越界访问的空间没有被占用,可以正常访问,输出垃圾值;
②当越界访问的空间被占用,但是不是重要的数据,可以访问,输出垃圾值 ;
③当越界访问的空间被占用,并且存储重要的数据,不可以访问,段错误。
2.请问一下代码有什么问题
int main()
{
char a;
char *str=&a;
strcpy(str,"hello")
printf(str)
return 0;
}
答:共有两处错误。
①在定义一个字符串数组的时候,不能直接定义为a,定义为a指向的是单字符a的地址,它只能容纳一个字节大小,所以在函数将字符串“hello”复制给str时,会导致越界;
②strcpy(str,"hello")与printf(str)两个语句,未使用分号结束。
3.有什么错?
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
答:指针s指向的是字符串常量,字符串常量在只读区,只能读取不能修改,s[0]='B'表示对字符串常量的第一个值进行修改,所以会报错,出现段错误 。
4.下面是一段计算0……100累加和的代码,请指出这段代码中的错误。
int main()
{
int *MyData;
int Count=100;
int Sum,i;
for(i=0;i<Count;i++){
*MyData++=i;
}
for(i=0;i<Count;i++){
Sum+=*MyData;
MyData++;
}
return Sum;
}
答:共有两处错误。
①i<Count,使得i=100时无法进入循环;
②int *MyData定义的是一个野指针,未被初始化的指针会造成计算机混乱,甚至死机【计算机随机的地址,不确定,不正确】;
③sum没有初始化,未清零。