c语言学习------指针

理解指针

指针:使用指针变量时,计算机内存会为指针变量开辟空间,存放地址编号

地址:内存以字节为单位进行管理,一个字节一个编号,内存开空间的时候首字节的地址编号

空间:内存数值的内存空间,地址+数据类型确定一个空间

值和地址举例:

值: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:输出字符串数组

  • 42
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值