day_04 小白学c语言第四天
1.1指针定义
指针:指针变量,内存会为指针变量开辟空间,存地址编号
地址:内存以字节为单位进行管理,1个字节1个编号,内存开空间的时候首字节的地址编号。
空间:存储数值的内存空间, 地址+数据类型确定一个空间。
指向对象类型的数据类型* 指针名;//例 int *a; a才是指针变量,并不是*a,int *是为了说明这是指针类型
指针指向谁的地址,就指向谁,并保存地址
例 int b =100;
int a = 50;
int *p;
p = &b;//printf("%d",*p);----这里就会输出b地址内存的值
p = &a;//printf("%d",*p);----直接给指针p 赋值a地址,*p又直接变为*(&a)=50
1.2操作空间
指针本身的空间------指针名
指针指向的空间------*指针名
//指针定义时候的* ---- 代表指针的标记
//指针使用的时候* ---- 代表 解地址
int a = 30;
int *p; // *xx --- 指针标记
p = &a;
*p = 20;// *----解地址,*p ==*(&a)==a
1.3指针的空间大小
计算空间大小要用到sizeof
指针空间的大小和指向对象的数据类型无关,应为指针变量之村首地址。
例: int *arr[4];// 存4个int* ==16/32 看使用的是32位/64位
printf("%d %d\n",sizeof(arr),sizeof(int* [4]));//打印均为16(使用32位)
1.4指针偏移
指针可以指向一块连续的空间,通过指针偏移对空间进行读写操作。
指针指向数组中的元素。
例: int a[5] = {4,5,6,7,8};
int *p = a;// p指向a的首地址a[0] p=&a[0]
//p ------&a[0]
//p+1 ----&a[1]
//p+2-----&a[2]
printf("%p %p %p %p %p\n",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
//%p是用来输出地址的格式控制符。
printf("%p %p %p %p %p\n",*(p),*(p+1),*(p+2),*(p+3),*(p+4),*(p+5));
//这两个输出结果相同
两个指针相减
int a[5] = {40,50,60,7,20};
int *p = a;//指针变量等于数组名,数组名代表数组的首地址(&a[0])
int*q = &a[3];
printf("%d\n",q-p);//结果为3 ------- 指向数组里面的元素的指针相减 = 元素下标之差
指针偏移用在指针指向一块连续的空间。
练习:
#include<string.h>
int main()
{
- char str1[30] = "hello world";
- char str2[30] = {'\0'}; //定义一个指针,通过指针操作将str1里面的字符复制到str2里面
- char *p;
- p = str1;
- // str2[0] = *(p+0);
- // str2[1] = *(p+1);
- int len = strlen(str1);
- int i;
- for(i=0;i<len;i++)
- {
- str2[i] = *(p+i);
- }
- printf("%s",str2);
- }
- str2[i] = *(p+i);
- {
- for(i=0;i<len;i++)
- int i;
- int len = strlen(str1);
- // str2[1] = *(p+1);
- // str2[0] = *(p+0);
- p = str1;
- char *p;
- char str2[30] = {'\0'}; //定义一个指针,通过指针操作将str1里面的字符复制到str2里面
return 0;
}
1.5++ -- 操作
练习:
1、使用指针将str1里面的字符倒序存放到str2里面
char str1[30] = "hello world";
char str2[30] = {'\0'};
char str1[30] = "hello world";
char str2[30]={'\0'};
char *p;
int i;
int len = strlen(str1);
p = &str1[len-1];
for(i=0;i<len;i=i+1)
{
str2[i] = *p;
p--;
}
printf("%s",str2);
2、输入一个字符串,输出这个字符串是不是回文字符串,如果是输出yes否则输出no
char str[30] = {'\0'};
printf("请输入一个字符串");
scanf("%s",&str[0]);
int len = strlen(str);
char *p;
char *q;
int flag = 0;//定义一个标识符 = 0
for(p=&str[0],q=&str[len-1];p<q;p++,q--)
//当p>q,说明已经过了一半
{
if(*p!=*q)
{
flag = 1;
}
}
if(flag==0)
{
printf("yes");
}
else
{
printf("no");
}