指针
- 通过一个指针来保存一个地址。
& 取指操作符。 &a 取a的指针
*取值操作符, *p 取 指针p 的值
*p 即 变量a
int *p ;
p = &a ; //指针指向变量a的地址
即
int *p=&a ;
-
数据类型为 int * 型 ,所以 p 也为 int * 型。
32位操作系统下,指针的数据类型: int* ,float* ,double * ,char * ,都为4个字节。
64位操作系统下,指针的数据类型占 8 个字节大小。 -
空指针
指针变量指向内存中编号为 0 的空间(该空间不能被访问,0~255的内存编号被系统占用了,不可访问)
用于初始化指针变量
int *p = NULL ; -
野指针
指针变量指向非法的内存空间
如:
int * p =( int *)0x1100 ;
cout << *p << endl;
是不可用的 ,报错!
空指针、野指针都不是自己申请的空间,所以访问都会出错。
- const修饰指针(常量指针)
即 形式上
int a = 1;
int b = 1;
const int* p =&a ; // 常量指针
特点: 指针的指向可以修改,但是指针指向的值不可以修改。
所以 p= &b; 可行, 指向可以修改。
所以 * p = 2 ; 是错误的 ,值不可修改。 (const限定了 * p)
- const修饰常量(指针常量)
int* const p = &a ;
特点: 指针的指向不可以改,指针指向的值可以改
p = &b ; 错误的,指向不能更改 (const限定了 p)
*p =2 ; 可行,指向的值可以改
- const修饰指针,const修饰常量
const int* const p = &a ;
特点: 指针的指向 和 指针指向的值 都不可以改。
- 指针和函数
值传递不改变值,但是地址传递改变值
void swap1(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
void swap2(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 1;
int b = 2;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
swap1(a, b);
cout << "swap1a=" << a << endl;
cout << "swap1b=" << b << endl;
swap2(&a, &b);
cout << "swap2a=" << a << endl;
cout << "swap2b=" << b << endl;
- 将数组传进函数里
把首地址传进来可以用int* arr接收
void bubbleSort(int* arr, int len) //冒泡排序
{
for (int i = 0; i < len -1 ; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void PrintArray( int *arr,int len) //打印
{
for (int i = 0; i < len; i++)
{
cout << arr[i]<<" " ;
}
cout << endl;
}
int main()
{
int arr[] = {2,7,9,3,10,6,8,1,4,5};
int len = sizeof(arr) / sizeof(int); //得出数组长度用于函数
bubbleSort( arr,len );
PrintArray(arr ,len);
system("pause");
return 0;
}