目录
1.定义指针
2.特殊指针
修饰指针
4.指针访问数组
5.指针与函数结合实例
6.指针的移动,和数组关系
7.多重指针&多重指针数组
1.定义指针
语法
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;
}
2.特殊指针
空指针:int *p =NULL;
野指针:为被声明的内存地址,不可访问。
修饰指针
常量指针:const int *p =&a;
指针指向的对象可以更改
指针指向的值不可更改
指针常量 int * const p =&a;
指针指向的对象不可以更改
指针指向的值可更改
4.指针访问数组
#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;
}
5.指针与函数结合实例
#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;
}
6.指针的移动,和数组关系
指针与数组的关系,C语言指针和数组的关系详解
数组和指针的关系(区别)详解
C语言数组指针(指向数组的指针)
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 个字节:
- *(numbers +1)是指地址 numbers + 1X2 处的值。
- *(numbers + 2)是指地址 numbers + 2X2 处的值。
- *(numbers + 3)是指地址numbers + 3X2 处的值。
以此类推。
假设 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。
7.多重指针&多重指针数组
多重指针
#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;
}