重点内容:
指针:
其他类型不能存储内存地址,而指针可以存储内存地址
定义:
数据类型 *指针名;
指针的初始化和赋值:
int *p; –>定义了一个int*类型的指针p但是没有初始化是一个野指针
int *p1 = &a; //定义了一个int *类型的指针,用a的地址给指针初始化
int *p2 = NULL; //将指针初始化为空指针
p = &a; //p1和p都指向变量a(都保存变量a的地址)
指针和变量的关系:
指针保存变量的首地址,就称为指针指向该变量
变量有变量的地址,指针也有自己的地址
指针指向变量只能指向变量的首地址
通过指针间接访问变量:
只有通过变量名访问才是直接访问
指针: *地址 —–> 获取到该地址中的值
指针涉及到的两个运算符:
*: 1、乘法运算 2、定义指针变量 3、间接访问地址中的值
区分2和3:观察*前面是否有数据类型
&: 1、按位与 2、取地址
指针的大小:
指针变量的大小是固定的: 64位操作系统占8Byte,32位操作系统占4Byte
指针数据类型的作用:
决定了指针的偏移量,指针一次可以操作的空间
指针变量的数据类型和指向数据的数据类型指针
指针之间的强制类型转换:
指针之间数据类型的强转是安全的,指针之间的强转只改变指针可以操作的空间
大小端存储:
大端存储:数据高位存在地址低位(网络通信传数据)
小端存储:数据低位存在地址低位(大部分的计算机都是小端存储)
测试大小端存储时,注意数据的高数据位和低数据位要不相同
指针的运算:
指针本质上是内存地址的编号
大部分运算对指针没有意义
常用:算数加减法、自增、比较
特殊的指针:
指针和一维整形数组结合:
前面对于数组中元素的访问,实际上就是通过数组中元素的地址进行访问
数组名本身是数组中首元素的地址
指针和一维字符数组结合:
和指针指向一维整形数组除数据类型外,都一致
作业:
1.用指针和一维整形数组结合,完成冒泡排序和选择排序
程序源码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int arr[10];
printf("please enter arr:");
int len=sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<len;i++)
{
scanf("%d",&arr[i]);
}
int *p=arr;
for(int i=1;i<len;i++)
{
for(int j=0;j<len-i;j++)
{
if(p[j]>p[j+1])
{
int temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
for(int i=0;i<len;i++)
{
printf("%d\\t",arr[i]);
}
putchar(10);
int *q=arr;
for(int i=1;i<len;i++)
{
int max_index=i-1;
for(int j=i;j<len;j++)
{
if(q[max_index]<q[j])
{
max_index=j;
}
}
if(max_index!=i-1)
{
int temp=q[max_index];
q[max_index]=q[i-1];
q[i-1]=temp;
}
}
for(int i=0;i<len;i++)
{
printf("%d\\t",arr[i]);
}
putchar(10);
return 0;
}
2.用指针实现strcpy函数、strcat、strcmp函数
strcpy函数:
程序源码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char arr1[20]="welcome to ";
char arr2[20]="hqyj";
char *p1=arr1;
char *p2=arr2;
while(*p2)
{
*p1=*p2;
p2++;
p1++;
}
*p1=*p2;
puts(arr1);
return 0;
}
strcat函数:
程序源码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char arr1[20]="welcome to ";
char arr2[20]="hqyj";
char *p1=arr1;
char *p2=arr2;
while(*p1)
{
p1++;
}
while(*p2)
{
*p1=*p2;
p1++;
p2++;
}
*p1=*p2;
puts(arr1);
return 0;
}
strcmp函数:
程序源码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char arr1[20]="welcome to ";
char arr2[20]="hqyj";
char *p1=arr1;
char *p2=arr2;
while(*p1&&*p1==*p2)
{
p1++;
p2++;
}
if(*p1-*p2>0)
printf("p1>p2\\n");
else if(*p1-*p2<0)
printf("p1<p2\\n");
else
printf("p1==p2\\n");
return 0;
}
3.终端输入带空格的字符串,用指针的方式删除字符串中的空格
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char arr[15];
printf("请输入字符串:");
gets(arr);
char *p=arr;
char *q=arr;
while(*p)
{
if(*p!=' ')
{
*q=*p;
q++;
}
p++;
}
*q='\\0';
printf("删除空格后的字符串:");
puts(arr);
return 0;
}
4.思维导图
评论前必须登录!
注册