铁律1、指针是一种数据类型;是指它指向的内存空间的数据类型。
1)指针也是一种变量,占有内存空间,用来保存内存地址;
2)*p操作内存。
在指针声明时,*号表示所声明的变量为指针;
在指针使用时,*号表示操作指针所指向的内存空间中的值(*号就像一把钥匙通过内存地址找到一块内存空间,然后操作内存)
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3)指针变量和它指向的内存空间是两个不同的概念。
//含义5 保证所指的内存块能修改
数据类型的本质:固定大小内存块的别名;
铁律2、间接赋值(*p)是指针存在的最大意义
1)两码事:指针变量和它指向的内存块。
2)条件反射:指针指向某个变量,就是把某个变量地址值赋给指针。
3)*p间接赋值成立条件:3个条件
a)2个变量(通常一个实参,一个形参)
b) 建立关系,实参取地址赋给形参指针。
c) *p形参去间接修改实参的值。通过被调用函数修改形参的值,间接修改了实参的值。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int getCopy2(char** myp1, int* mylen1, char** myp2, int* mylen2)
{
int ret = 0;
if (myp1 == NULL || myp2 == NULL || mylen1 == NULL || mylen2 == NULL)
{
ret = -1;
printf("NULL error:%d\n", ret);
return ret;
}
char* tmp1;
tmp1 = (char*)malloc(100);
char* tmp2;
tmp2 = (char*)malloc(200);
strcpy(tmp1, "abcdefg");
strcpy(tmp2, "1234567");
// 1级指针的间接赋值.
*mylen1 = strlen(tmp1);
*mylen2 = strlen(tmp2);
// 2级指针的间接赋值
*myp1 = tmp1;
*myp2 = tmp2;
return ret;
}
int main()
{
int ret = 0;
char* p1 = NULL;
int len1 = 0;
char* p2 = NULL;
int len2 = 0;
ret = getCopy2(&p1, &len1, &p2, &len2);
if (ret != 0)
{
printf("func getCopy2() error:%d\n", ret);
return ret;
}
printf("p1 string = %s,strlen p1 =%d\n", p1,len1);
printf("p2 string = %s,strlen p2 =%d\n", p2, len2);
system("pause");
return 0;
}