今日学习指针,真的有点抽象。
1.什么是指针
指针:使用指针变量时,内存会为指针变量开辟空间,存地址编号;
地址:内存以字节为单位进行管理,一个字节一个编号,内存开空间的时候首字节的地址编号。
空间:存储数值的内存空间,地址+数据类型确定一个空间。
值和地址——int a=30;
值:30——%d
地址:&a——%p
2.指针的含义
指向对象的数据类型* 指针名
int a=100;
int* p=&a;//定义的是变量p,p才是指针变量。
指针保存谁的地址就指向谁,指向谁就保存谁的地址
int b=100;
p=&b;
巩固练习
定义第一个指针先指向a,通过指针访问a的地址和值,将指针指向b,访问b的地址和值。
#include<stdio.h>
int main()
{
int a=30,b=50;
int *p=&a;
printf("%p %d\n",p,*p);
printf("%p %d\n",&a,a);
p=&b;
printf("%p %d\n",p,*p);
printf("%p %d",&b,b);
return 0;
}
3.指针操作内存
指针名——指针本身的空间
*指针名——指针指向空间
指针定义的时候的 * ——代表指针的标记
指针使用的时候的 * ——代表解地址
比如:
int a=30;
int* p; // * ——指向指标
p=&a;
*p=20; // * ——解地址——解完之后得到的是指针指向空间
// *p=*(&a)=a
4.指针空间大小
sizeof用法:sizeof(数据类型或者变量名/数组名).
举例:展示各个数据类型的字节
#include<stdio.h>
int main(void)
{
int a;
printf("%d %d\n",sizeof(int),sizeof(a));
int *p;
char *q;
float *t;
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(float*));
return 0;
}
5.指针的偏移
指针可以指向一块连续的空间,通过指针的偏移对空间进行续写操作
指针可以指向数组中的元素。
int[5]={4,8,10,29,4};
int* p=a;
p指向a[0] p=&a[0]
p ——&a[0]
p+1——&a[1]
p+2——&a[2]
对应验证
#include<stdio.h>
int main(void)
{
int a[5] = {4,8,10,29,4};
int* p = a;
printf(" %p %p %p %p %p\n",&a[0],&a[1],&a[2],&a[3],&a[4]);
printf(" %p %p %p %p %p\n",p+0,p+1,p+2,p+3,p+4);
char chs[5] = {'l','o','k','p','y'};
char* q;
q = &chs[4];
printf(" %p %p %p %p %p\n",&chs[0],&chs[1],&chs[2],&chs[3],&chs[4]);
printf(" %p %p %p %p %p\n",q-4,q-3,q-2,q-1,q);
return 0;
}
指针的偏移和指向对象的数据类型有关,以 指向对象的数据类型 为单位进行偏移
指向对象的数据类型:从指针的定义上看。
还有一点补充:
(引入16进制)
int a=0x12345678;(两个16进制存入到一个字节里面)
#include<stdio.h>
int main(void)
{
int a = 0x12345678; // 两个16进制存入到一个字节里面
int* p = &a;
printf(" %x\n",*p); // 0x12345678
char* q = (char *)&a;
printf(" %x %x %x %x\n",*q,*(q+1),*(q+2),*(q+3));
return 0;
}
两个指针相减
int a[5] = {80,45,7,100,20};
int* p = a;
int* q = &a[3];
printf("%d\n",q-p);
输出的结果是3(3-0=3)
// 指向数组里面的元素的指针相减 = 元素下标之差
*q-*p=20(100-80=20)
巩固练习
定义一个指针,通过指针操作将str1里面的字符复制到str2里面
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[30]={"hello world"};
char str2[30]={'\0'};
char *p;
p=str1;
int len=strlen(str1);
int i;
for(i=0;i<len;i++)
{
str2[i]=*(p+i);
}
printf("%s",str2);
return 0;
}
6.指针的++--操作
指针++
#include<stdio.h>
int main(void)
{
// 指针++
int a[5] = {90,100,34,67,8};
int *q = a;
int i;
for(i=0;i<5;i++)
{
printf("%d ",*q);
q++;
}
return 0;
}
课后作业
1、使用指针将str1里面的字符倒序存放到str2里面
#include<stdio.h>
#include<string.h>
int main()
{
char str1[30]={"hello world"};
char str2[30]={'\0'};
char *p;
int len = strlen(str1);
p = &str1[len-1];
int i,j;
for(i=len-1;i>=0;i--)
{
str2[i] = *(p-i);
}
printf("%s",str2);
return 0;
}
2、输入一个字符串,输出这个字符串是不是回文字符串,如果是输出yes否则输出no
"12321" "1221" "121"
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[30];
printf("输入一个字符窜:");
scanf("%s",str1);
char *p;
char *q;
int len=strlen(str1);
p=&str1[0];
q=&str1[len-1];
int i;
int j=0;
for(i=0;i<len/2;i++)
{
if(*(p+i)!=*(q-i))
{
j=1;
break;
}
}
if(j==1)
{
printf("no");
}
else
{
printf("yes");
}
return 0;
}
好啦!
今天over!