C语言 | 指针

指针的运用可以看到并掌握内存空间的分配、回收,和直接对其进行操作,并以一定的方式进行内存管理使其高效运行,令代码按照自己设计的结构域运行
像Python等高级语言拥有较高的开发效率,只需几行代码便可实现几百行中级语言代码的功能,但是相对的,其执行效率就比较低,因为中间层的框架限定了内存的管理。C语言能掌握从底层到顶层的所有内存管理,相应的开发效率就偏低

使用指针意味着对内存的直接管理

  1. 操作内存的效率(读写)更高
  2. 可以直接参与整个内存空间的管理
  3. 可以实现复杂的内存跳转(跨过语法的限制)
  4. 能够实现更多的高级操作

64位机器中所有类型的指针变量都占8个byte

int c = 3;
char *ptr = &c;//这里的*表示ptr是一个指针变量
//地址操作符&表示取内存首地址,这里返回c的内存地址,若是数组名则无需&
printf("ptr: %d\n", (int)sizeof(ptr));

*ptr = 100;
//这里的*是解引用,对指针变量(ptr)解引用就是找到这个指针变量存的地址,再根据这个地址找到相应的内存,从而可以对这个内存上的内容进行操作,如这里的赋值
printf("c_after: %d\n", c);
printf("c_addr: %p\n", &c);
//使用取址符&及%p即可获取并输出变量在内存中的地址

指针变量前的类型决定了

  1. 该指针变量对其包含首地址所指向的内存空间的操作权限(范围)
  2. 该指针的偏移量(多见于数组)

示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
   
	int a,b;
	char *ptr1 = &a;
	*ptr1 = 255;
	printf("a: %d\n",a);
	*ptr1 = 256;//这里多了一位,根据位操作性质偏回0
	printf("a_after: %d\n",a);

	int *ptr2 = &b;
	*ptr2 = 1000;
	printf("b: %d\n",b);

	free(ptr1);
	free(ptr2);
	ptr1 = NULL;
	ptr2 = NULL;
//注意,当一个被声明的指针还未拥有合法地址时,需将其指向NULL作为警告

	return 0;
}

对复杂数据类型地址的获取

struct node
{
   
	int a;
	int b;
};
int main()
{
   
	struct node p; 
	printf("address of node= %p \n", &p);
	printf(" address of member variable a = %p \n", &(p.a));
	printf(" address of member variable b = %p \n", &(p.b));

	return 0;
}

指针&数组

数组

一维数组

定义一维数组后,可定义一个与其类型相同的指针变量指向该数组
int i[10] = {1,2,3,4,5,6,7,8,9,10}, *pi;
pi= i;

*pi就指向了数组i的第一个单元,等价于:
pi = &i[0]

此后,可以通过移动指针pi来指向数组 i 中不同元素,如
pi += 4,则 pi 指向 i[4] 这个元素的地址

指针+偏移量(跟定义指针那个类型)

另外,指向数组的指针变量也可以用数组的下标形式表示:
pi[0] = &i[0]
pi[1] = &i[1]

#include < stdio.h>
int main()
{
   
	int i, a[10]={
   0};
	int *p=NULL;
	for(p = a; p < a+10; p++)
		scanf("%d",p); 
		
	for( p= a, i = 0; i < 10; i++,p++)
		prrint("a[%d]= %d \n",i, *p);
	return 0;
}

动态内存分布(malloc
让指针变量指向来自的动态分配内存

#include <stdio.h>
#include <stdlib.h>

int data;

int main()
{
   
	printf("data: %p\n", &data);
	int *ptr = (int *)malloc(4*sizeof(int));
	//ptr用于记住这块内存首地址,同时通过偏移量可以访问后面的内存空间
	if(ptr == NULL)
	{
   
		printf("malloc faied!\n");
		return -1;
	}
	printf("ptr_addr: %p\n", ptr);
	free(ptr);
	ptr = NULL;
	
	char *ptr2 = (char *)malloc(4);
	if(ptr2 == NULL)
	{
   
		printf("malloc faied!\n");
		return -1;
	}
	printf("ptr2_addr: %p\n", ptr2);
	free(ptr2);
	ptr2 = NULL;

	return 0;
}

操作实例

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
   
	int data[4] = {
   10,20,30,40};

 

	int *ptr = data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值