指针数据
指针本质:就是一个存储地址的容器.
【提示】编译器 解析的时候 * 后面的指针类型结合 int *a,b,那么a是指针,b 还是一个变量;
int *a,b;
[规则]:不管是全局的还是局部的,静态或非静态指针变量,都要在声明的时候进行赋值初始化,要么为NULL;
指针运算
1.指针自增(++),前一个元素
2.指针自减(–),后一个元素
3.指针加一个正整数,前进i个元素
4.指针减一个正整数,退后i个元素
5.两个同类型指针相减,它们之间元素个数之和
6.指针赋值,把指针赋值给另一个指针。
7.指针比较 ,最常用的 ==,!=
8.取地址(&)和反引用(*)。
【提示】:指针的加减,并不是普通的加减还要加上指针所指字节信息;
int a = 1;
int p = &a;
printf("%d",p+1); // 编译器改为 p + (1 * siezof(int) )
【提示】:
1.&指针,不可以重复多次 &&
2.指针 ,取指的时候要确保指针的正确性,(例如野指针情况),不能对void类型 用*取值。
本质:指针传递其实就是传的这个这个容器的地址,不是指向的地址;
【提示】:指针在函数之间传递,要保持数据指向有效性和正确单元,内存被释放还在用该指针,传局部变量;
void funC(char *& p) // &p 是P本身的地址 0x00011
{
p = (char*)malloc(10); // p 0x00022 p所指向的内存地址
}
int main()
{
char *str = NULL;
funC(str); // 0x00011
strcpy_s(str, 6, "hello");
std::cout << str << std::endl;
free(str);
return 0;
}