前言
要复习C语言,不可避免得就要谈到指针,作为C语言的重点,也是C语言的难点,经过几天的复习,今天对指针做一个小结。
1. 指针的大小与什么有关系
1.cpu位数(32位数4字节,64位数8字节)
2.操作系统位数(32位数4字节,64位数8字节)
3.编译器的位数(32位数4字节,64位数8字节)
2.指针做形参
数组在做形参是会退化为指针.他会把数组首地址传送过来,而不是所有数组元素(C语言的优势:快捷高效)
3.指针作为函数参数的精髓,是C语言特有的现象,是C语言的精华,主函数和被调函数之间通过指针操作内存交换运算结果。
- 在主函数直接操作内存空间
int a;
char *p;`
a = 10;
printf("%d\n",&a);
//假设a在栈区的地址为0x123456;
*((int *)123456) = 200;
- 通过指针间接修改值
int a;
char *p;
a = 10;
p = &a;
*p = 200;
printf("%d\n",a)
- 通过函数指针间接修改值
int getNum(int *p)
{
*p = 2;
}
int main()
{
int a = 1;
int *p = NULL;
printf("%d\n",a);
getNum(&a);
//间接修改值
printf("间接修改值:");
printf("%d\n",a);
return 0;
}
- 指针的精髓(二级指针间接赋值)
#include<stdio.h>
#include<stdlib.h>
int getNum3(char **p1,int *len1,char **p2,int *len2)
{
char *tmp1 = NULL;
char *tmp2 = NULL;
tmp1 = (char *)malloc(100); //堆区申请空间
strcpy(tmp1,"123456");//往内存中写值
*len1 = strlen(tmp1);
*p1 = tmp1;//与一级指针写值同理
tmp2 = (char *)malloc(200);
strcpy(tmp2,"654321");
*len2 = strlen(tmp2);
*p2 = tmp2;
}
int main()
{
char *p1 = NULL;
char *p2 = NULL;
int len1 = 0;
int len2 = 0;
getNum3(&p1,&len1,&p2,&len2); //通过一级指针和二级指针间接赋值和计算大小
printf("%s %s\n",p1,p2);//打印指针指向内存中的值不需要加*
printf("%d %d",len1,len2);
//堆区释放
if(p1 != NULL)
{
free(p1);
p1 = NULL;//避免野指针
}
if(p2 != NULL)
{
free(p2);
p2 = NULL;
}
return 0;
}