指针的运用可以看到并掌握内存空间的分配、回收,和直接对其进行操作,并以一定的方式进行内存管理使其高效运行,令代码按照自己设计的结构域运行
像Python等高级语言拥有较高的开发效率,只需几行代码便可实现几百行中级语言代码的功能,但是相对的,其执行效率就比较低,因为中间层的框架限定了内存的管理。C语言能掌握从底层到顶层的所有内存管理,相应的开发效率就偏低
使用指针意味着对内存的直接管理
- 操作内存的效率(读写)更高
- 可以直接参与整个内存空间的管理
- 可以实现复杂的内存跳转(跨过语法的限制)
- 能够实现更多的高级操作
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即可获取并输出变量在内存中的地址
指针变量前的类型决定了
- 该指针变量对其包含首地址所指向的内存空间的操作权限(范围)
- 该指针的偏移量(多见于数组)
示例
#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 =