C语言指针基础知识

* 和 & 用法

  • * 就是取指针所指地址处保存的数值,
  • & 就是去一个变量的地址。

例如:

int a=10;  
print("\n%d",&a); //打印出来的是a的地址  
print("\n%d",*(&a); //打印出来的是10  

数组名代表数组的首地址,数组指针的加减可以实现指针指向数组上一个或者下一个元素的功能

int a[10]={1,2,3,4,5,6,7,8,9,0};  
int *p = a;  
cout << *p << endl;  
cout << *(p+1) << endl;  

指针数组

int a = 16, b = 932, c = 100;  
// 定义一个指针数组
int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int *arr[]  
// 定义一个指向指针数组的指针, 指向数组第0个元素
int **parr = arr;  
printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);  
// *parr 数组第0个元素的值,也是指针, **parr是第0个元素的值
printf("%d, %d, %d\n", **(parr), **(parr+1), **(parr+2));  

下标和指针的关系

p[i] 等价于 *(p+i)

int a = 1;  
int *b = &a;  
b[1] = 12;  
*(b + 1) = 77;  // 上面这条命令和这条命令是等价的
cout << b << endl<< b[1] << endl << &b[1] << endl;

// 用指针的形式遍历
for (int i = 0; i < sizeof(b)/ sizeof(b[0]); ++i) {  
    cout << *(b+i) << endl;
}

* a和&a作为函数的参数时有什么区别

  • *a 代表参数是一个指针
  • &a 代表传递引用,可以修改原始的值

c++创建对象的三张方式

Test test1;  // 栈中分配  ,由操作系统进行内存的分配和管理  
Test test2 = Test;  // 栈中分配  ,由操作系统进行内存的分配和管理  
Test *test3=new Test();  // 堆中分配,由管理者进行内存的分配和管理,用完必须delete(),否则可能造成内存泄漏  
test1.add();  
test2.add(); // "." 是结构体成员引用  
test3->add(); // "->"是指针引用  
delete(test3);  

参考文档