一、指针是什么?
指针是一个变量,该变量的值是另一个变量的地址
变量 | int *P=&a | int a=5 |
变量值 | 0x35df | 5 |
变量地址 | 0x6325 | 0x53df |
指针变量p的值就是变量a的地址。
二 指针类型
指针所指向变量的类型就是指针的类型
例2,有三个不同的变量:请问右边的三个运算有何不同
int A,*PI=&A; PI++; 地址增加两个字节
Char B,*PC =&B; PC++; 地址增加一个字节
Float C,*PF=&C; PF++; 地址增加两个字节
指针的三个要素
1、指针指向的地址(其实就是指针的值)
2、指针指向的地址上的内容
3、指针本身的地址(其实就是指向指针的指针的值)
例 int A , *PA, **PPA;
PA=&A;
PPA=&PA;
则 **PPA=*PA=A;
*PPA=PA=&A;(*PPA、PA都是变量指针,存放的是变量的地址)
PPA=&PA;(PPA是指向指针的指针,存放的是指针的地址)
PA是整型指针,他的值是整型变量A的地址&A;
PPA是指向指针的指针;他的值是指针PA的地址&PA;
指向指针的指针 | 整型指针变量 | 整型变量 | |
变量 | int **PPA=&PA | int *PA=&A | int A=5 |
变量的值 | 0x58 | 0X43 | 5 |
变量的地址 | 0X74 | 0X58 | 0X43 |
void GetMemory2(char **p, int num)//char **p是指向指针的指针存放的是一个指针的地址
{
*p = (char *)malloc(sizeof(char) * num);//(*p)往变量p所存的值所指向的地址赋值 即往上表中的0x58这个地址赋值、即改变指针变量的值 改变str的
{
*p = (char *)malloc(sizeof(char) * num);//(*p)往变量p所存的值所指向的地址赋值 即往上表中的0x58这个地址赋值、即改变指针变量的值 改变str的
//指向。最终str将指向malloc所返回的地址空间
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是&str(指针的地址),而不是str(指针的值)
strcpy(str, "hello");
cout<< str << endl;
free(str);
}解析:如果非得要用指针参数去申请内存,那么应该改用“ 指向指针的指针”.由于“ 指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是&str(指针的地址),而不是str(指针的值)
strcpy(str, "hello");
cout<< str << endl;
free(str);
}解析:如果非得要用指针参数去申请内存,那么应该改用“ 指向指针的指针”.由于“ 指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。