赞
踩
目录
语法
1.数据类型 * 指针名称 =&变量;
2.指针名称 =&变量;
*p代表的就是指针地址所指向的变量
指针的地址:&p
- #include <iostream>
- #include <string>
- using namespace std;
-
- int main()
- {
-
- int a = 100;
- int b =300;
-
- cout << a << endl;
-
- int *p = &a; //初始化指针
-
- cout <<"a="<< a << endl;
-
- cout << "p=" << p << endl;
-
- cout << "*p=" << *p << endl;
-
- p = &a;
-
- cout << "p=" << p << endl;
-
- cout << "*p=" << *p << endl;
-
- *p=200;
-
- cout <<"a="<< a << endl;
-
- cout <<"&*p="<< &*p << endl;//变量a的地址
- cout <<"&p="<< &p << endl;//指针的地址
-
- system("pause");
-
- return 0;
- }

空指针:int *p =NULL;
野指针:为被声明的内存地址,不可访问。
常量指针:const int *p =&a;
指针指向的对象可以更改
指针指向的值不可更改
指针常量 int * const p =&a;
指针指向的对象不可以更改
指针指向的值可更改
- #include <iostream>
- #include <string>
- using namespace std;
-
- int main()
- {
- int arr0[] = {1, 2, 3, 4, 5};
- double arr1[] = {1.1, 2.1, 3.1, 4.1, 5.1};
-
- int *p = arr0; //数组名就是第一个元素的地址,不用&
-
- double *p2 = arr1;
-
- cout << "*p=" << *p << " arr0[0]=" << arr0[0] << endl;
-
- p++;//移位4字节
-
- cout << "*p=" << *p << " arr0[1]=" << arr0[1] << endl;
-
- cout << "*p2=" << *p2 << " arr1[0]=" << arr1[0] << endl;
-
- p2++; //指针移位会按照不同类型进行移位 移位8字节
-
- cout << "*p2=" << *p2 << " arr1[1]=" << arr1[1] << endl;
- //不同指针的类型占用空间一样
- cout << "sizeof p=" << sizeof(p) << endl;
- cout << "sizeof p2=" << sizeof(p2) << endl;
-
- cout << "sizeof *p=" << sizeof(*p) << endl;
-
- cout << "sizeof *p2=" << sizeof(*p2) << endl;
-
- cout << "arrdess of=arr1[0]" << arr1 << endl;
-
- cout << "arrdess of=arr1[1]" << &arr1[1] << endl;
-
- cout << "value of p2" << p2 << endl;
-
- system("pause");
-
- return 0;
- }

- #include <iostream>
- #include <string>
- using namespace std;
-
- void bubbleSort(int *p, int arr_length);
-
- int main()
- {
- int arr0[] = {10, 6, 7, 4, 5, 6, 8, 7, 6, 45, 52, 4}; //函数传递数组的实质其实就是指针
-
- bubbleSort(arr0, sizeof(arr0) / sizeof(arr0[1]));
-
- system("pause");
- return 0;
- }
-
- void bubbleSort(int *p, int arr_length) //int *p 和 int p[] 等价
- {
- for (int i = 0; i < arr_length - 1; i++)
- {
-
- for (int j = 0; j < arr_length - i - 1; j++)
- {
- if (p[j] > p[j + 1])
- {
- int temp = p[j];
- p[j] = p[j + 1];
- p[j + 1] = temp;
- }
- }
-
- /* code */
- }
-
- for (int i = 0; i < arr_length; i++)
- {
- cout << p[i] << " ,";
- }
- cout << endl;
- }

- int arr[] = { 99, 15, 100, 888, 252 };
- int *p = arr;
arr 本身就是一个指针(严格来说应该是“arr 被转换成了一个指针”),可以直接赋值给指针变量 p。arr 是数组第 0 个元素的地址,所以int *p = arr;
也可以写作int *p = &arr[0];
。也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)。
数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int)
,因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。
也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。
在 C++ 中,当给一个指针添加一个值的时候,实际上添加的值是把这个值乘以指针引用的数据类型的大小。换句话说,如果给 numbers 加 1,实际上就是给 numbers 加上 1Xsizeof(short);如果给 numbers 加 2,实际上就是给 numbers + 2Xsizeof(short),以此类推。在 PC 上,这意味着以下说法是真实的,因为 short(短整数)通常使用 2 个字节:
以此类推。
假设 p 是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?
*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素,上面已经进行了详细讲解。
*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。
(*p)++ 就非常简单了,会先取得第 n 个元素的值,再对该元素的值加 1。假设 p 指向第 0 个元素,并且第 0 个元素的值为 99,执行完该语句后,第 0 个元素的值就会变为 100。
多重指针
-
- #include <iostream>
-
- using namespace std;
-
-
-
- int main() {
-
- int a[5]={0,1,2,3,4};
-
- int *arr=a;
-
- int **p_arr;
-
- p_arr = &arr;
-
-
- cout<<sizeof(p_arr)<<endl;
-
- cout<<sizeof(arr)<<endl;
-
- cout<<p_arr<<endl;//变量保存arr地址
-
- cout<<&arr<<endl<<endl;
-
-
-
- cout<<*p_arr<<endl;//数组a的首地址
-
- cout<<arr<<endl;
-
- cout<<a<<endl<<endl;
-
-
- cout<<p_arr[1]<<endl;//arr[1]的地址
-
- cout<<&a[1]<<endl<<endl;//数组a【1】的地址
-
-
-
- cout<<p_arr[0]<<endl;
-
- cout<<&arr[0]<<endl;
-
- cout<<&arr[1]<<endl<<endl;
-
-
- cout<<*p_arr[0]<<endl;
- cout<<arr[0]<<endl;
-
- cout<<arr[1]<<endl;
-
-
- system("pause");
-
- return 0;
- }

多重指针数组
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
-
- int a[5] = {0, 1, 2, 3, 4};
-
- int *arr[2] = {&a[0], &a[1]};
-
- int **p_arr;
-
- p_arr = arr;
-
- cout << sizeof(p_arr) << endl;
-
- cout << sizeof(arr) << endl; //arr为int型数组
- cout<<"arr数组的首地址"<<endl;
- cout << p_arr << endl; //arr数组的首地址
- cout << &arr[0] << endl;
- cout << &arr << endl
- << endl;
-
- cout<<"数组a的首地址"<<endl;
- cout << *p_arr << endl;//数组a的首地址
- cout << arr[0] << endl;
- cout << a << endl
- << endl;
-
- cout<<"数组arr[1]的地址"<<endl;
- cout << &p_arr[1] << endl;
- cout << &arr[1] << endl
- << endl;
-
- cout<<"数组a[1]的地址"<<endl;
- cout<<p_arr[1]<<endl;
- cout<<arr[1]<<endl;
- cout<<&a[1]<<endl<<endl;
-
- cout<<"数组a[0]的值"<<endl;
- cout << *p_arr[0] << endl;
- cout << *arr[0] << endl;
- cout << a[0] << endl;
-
- system("pause");
-
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。