理解指针
指针:使用指针变量时,计算机内存会为指针变量开辟空间,存放地址编号
地址:内存以字节为单位进行管理,一个字节一个编号,内存开空间的时候首字节的地址编号
空间:内存数值的内存空间,地址+数据类型确定一个空间
值和地址举例:
值:24 ---%d 地址:&a---%p
指针定义
指针定义格式:指向对象的数据类型* 指针名;
举例:int* p = &a //定义的是变量p,p才是指针变量。
指针保存谁的地址就指向谁,指向谁就保存谁的地址
指针变量是变量,可以重复赋值。
int main(void){
int a = 24;
int b = 8;
int* p = &a;
printf("a的地址为:%p,a的值为%d\n",p,*p);
p = &b;
printf("b的地址为:%p,b的值为%d",p,*p);
return 0;
}
指针操作内存空间
指针本身的空间 指针名
指针指向的空间 *指针名
//指针定义时候的* ------代表指针的标记
//指针使用的时候* ------代表解地址
int a = 30;
int* p; //这里的*是指针标记
p = &a; //将a的地址值复制给p
*p = 30; //这里的*是解地址符,即为将a的地址解完之后得到的是指针指向空间
其中的效果即为 *p == *(&a) == a
指针的空间大小
使用函数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*)); // 4 / 8
printf("%d\n",sizeof(char*)); // 4 / 8
printf("%d\n",sizeof(float*)); // 4 / 8
return 0;
}
注意:指针空间大小和指向对象的数据类型无关,因为指针变量只存首地址。
int *arr[4]; // 数组 --- 16/32
// 存了 4个int * == 16/32
printf("%d %d\n",sizeof(arr),sizeof(int *[4]));
指针的偏移
指针可以指向一块连续的空间,通过指针偏移对空间进行读写操作
指针指向数组中的元素
int a[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;
}
指针的偏移和指向对象的数据类型有关,以 指向对象的数据类型 为单位进行偏移
指向对象的数据类型:从指针的定义上看。
两指针相减
在数组里面
int a[5] = {1,2,3,4,5};
int* p = a;
int* q = &a[3]
printf("%d\n",q-p); //结果为3(即为指针3 - 指针0 = 3)
结论:指向数组里面的元素的指针相减 = 元素下标之差
练习:
char str1[30] = "hello world";
char str2[30] = {'\0'};
定义一个指针,通过指针操作将str1里面的字符复制到str2里面
#include<stdio.h>
int main(void){
char str[30] = "hello world";
char str2[30] = {'\0'};
int len = strlen(str);
printf("%d\n",len);
int i;
char *p = str;
for(i=0;i<=len;i++){
str2[i] = *(p+i);
}
printf("%s",str2);
return 0;
}
定义两个指针,一个指向str1,一个指向str2,通过指针操作将str1里面的字符复制到str2里面
#include<stdio.h>
int main(void){
char str[30] = "hello world";
char str2[30] = {'\0'};
int len = strlen(str);
printf("%d\n",len);
int i;
char *p = str;
char *q = str2;
for(i=0;i<len;i++){
*(q+i) = *(p+i);
}
printf("%s",str2);
return 0;
}
循环变量一般用 i j k ,指针一般用 p q t h
c语言输出函数中
%p:输出地址值
%x:输出十六进制地址值
%s:输出字符串数组