指针是一种数据类型
间接赋值是指针存在的最大意义
int a = 10;
int *p = &a;
- 指针也是一种变量,占有内存空间,用来保存内存地址
- *p通过地址(p变量的值)找到一块内存,然后操作内存,*p在等号左边为赋值,在右边为取值
- 指针变量和它指向的内存块是两个不同的概念,给p赋值只会改变指针变量的值(地址),不会影响所指的内容,给*p赋值会改变所指的内容,不会影响指针变量的值(地址)
- 指针也是一种数据类型,例如int *p是指向了一个int类型的内存空间。指针的内存大小都是4个字节,而指针的步长是根据类型在内存中的占比大小来算的
int a = 0;//6422028
int *b = &a;
printf("%d\n", b);//6422028
b++;
printf("%d\n", b);//6422032
double *c = &a;
printf("%d\n", c);//6422028
c++;
printf("%d\n", c);//6422036
指针做函数参数
需要理解的是:主调函数还是被调函数分配内存,被调用函数是在堆上或栈上分配内存
一级指针的典型用法
做输入
int ShowBuf(char *p)
int ShowArray(int *array,int num)
做输出
int GetLen(char *pName,int *pLen)
二级指针的典型用法
做输入
int main(int arc ,char *arg[]); \\字符串数组
int ShouMatrix(int [3][4], int iLine);
做输出
int GetTeacher(Teacher **ppTeacher);
int GetTeacher_Free(Teacher **ppTeacher);
int getData(char **data, int *dataLen);
Int getData_Free(void *data);
Int getData_Free2(void **data); //避免野指针
三级指针的典型用法
做输出
int getFileAllLine(char ***content, int *pLine);
int getFileAllLine_Free(char ***content, int *pLine);
野指针 2种free形式
int getData_Free(void *data)
{
int ret = 0;
concreteType *temp = NULL;
if(data == NULL)
{
ret = -1;
//TODO
return ret;
}
temp = data;
if(temp != NULL)
free(temp);
return ret;
}
int getData_Free(void **data)
{
int ret = 0;
concreteType *temp = NULL;
if(data == NULL)
{
ret = -1;
//TODO
return ret;
}
temp = *data;
if(temp != NULL)
{
free(temp);
*date = NULL;
}
return ret;
}
对指针用法的补充:
- 指针指向谁就把谁的地址赋值给指针
- 指针对于链表来说是最适用的
- 在链表的学习中关键是分清链表操作和辅助指针变量之间的逻辑关系
- 对于JAVA语言来说其学习特点是学习、应用、上项目;而c/c++是学习、理解、应用、上项目
- 指针是c语言的半壁江山,而另外一半就是结构体