1.变量地址
2.变量的访问方式
1).直接访问:
直接访问:(变量名,即变量的地址)
2).间接访问(指针)
3.指针变量
1).指针变量含义:
用来存放地1址的变量
2).指针:
指针:地址。十六进制的无符号整型。4个字节。
4.指针变量的定义
1).定义方式:类型名*变量名
//定义一个执行int变量的指针变量
int * pa;
bool * pb;
int a;
bool b;
char *pc1,*pc2;
2).类型名:该指针变量所指向的内存中存放的数据类型
3).* 指针变量的定义符,表面后面的变量是指针变量
4).变量名:指针变量的名称,必须是合法标识符。
5.指针变量的赋值
1)用变量的地址:
通过地址运算符&获取变量的地址。
pa = &a;
pb = &b;
cout<<&a<<endl;
cout<<pa<<endl;
int * pa1;
pa1 = pa;
2)用相同类型的指针变量
3)赋空值NULL
注意p=NULL与未对p赋值的含义是不同的。
pa = (int*)0x123;//一般不这么写
pa1 = 0;
pa1 = NULL;
pa1 = nullptr;
int * pa2;
pa1 = pa2 = 0;
4)字符指针的赋值:
char c1 = 'a';
pc1 = &c1;
pc1 = "abc";//用字符串给字符指针赋值
5)数组名赋值:
int array[3];
pa1 = array;//数组名为该数组的首地址
6.指针变量的引用
1.取地址符&。
取地址符 & 。 作用:用在变量名之前,用来获取该变量的地址。
2.指针运算符(解引用运算符)*
解引用运算符 * 。 作用:用于指针变量名之前获取该指针变量所指向内存单元的值
3.运算符的应用
通过指针变量访问所指变量。
S4.运算符的规则
*与&优先级相同,且与++ – !等单目运算符优先级相同。结合性为右结合。
*&p==p;
&*pa==pa;
/*[]
p[n] =*p+n
*/
7.指针与一维数组
1.数组元素的指针:
数组名是数组的起始地址,也就是数组的指针,可以利用数组名+偏移量来引用数组元素。
2.指向数组的指针变量
指向数组的指针变量是用于存放数组的起始地址或某一数组元素地址的变量。
3.指针的运算
1)赋值运算
2)指针的加减法-地址偏移
指针的偏移:指针加上或者减去一个整数,表示指针偏移一个单位,单位大小=指针指向内容所占字节数。
int main(){
int arr [4]={12,35,64,72};
int *paa = &arr[0];
int *pab = &arr[3];
//paa地址所处的,内存地址为:00A0F77C
cout<<paa<<endl;
/*地址偏移:
*得到的是原地址所处的地址+1后的地址,的值00A0F780
*/
cout<<paa+1<<endl;
//pab-paa:两个地址相减得到的是,相差多少元素。
cout<<pab-paa<<endl;
//pab+paa:相加没有任何意义。
//cout<<pab+paa<<endl;
return ();
}
3)指针的自增自减
1)++:表示指针向后偏移一个单位
2)–:表示指针向前偏移一个单位
int*parr = arr;
paa++;//paa = paa+1 指针偏移
cout<<arr<<endl;//输出数组的首地址
cout<<&arr[0]<<endl;//输出数组首地址
cout<<parr<<endl;//输出数组首地址
cout<<arr + n<<endl;
cout<<&arr[n]<<endl;
cout<<parr + n<<endl;
parr++;
/*
*arr++;不对。因为arr表示数组的首地址是常量
*不可以变化所以arr不可以++
*/
4)关系运算
p1>p2表示p1处于高地址位置
*(arr+0);//去解引用,得到第一个元素的值
arr[0];
*(parr + 0);
4.通过指针引用数组元素
1)地址关系
//地址关系:
p==&a==&a[0]
2)内容关系
//内容关系:
*p==*a==[0]
int arr2[4];
//先用xx给它赋值
for(int * parr2 = arr2;parr2< arr2+4 ;i++)
{
cin>>*parr2;
cout<<*parr2<<endl;
}
/*
*arr2:0x005bf8a4{...}
parr20x005bf8ac{...}
*/
/*
for(int * parr2 = arr2;parr2< arr2+4 ;i++)
{
cin>>*parr2;
cout<<*parr2<<endl;
}
*/
5.指针与一维数组代码0712
#include <iostream>
using namespace std;
int main()
{
int a = 3;
int * pa = &a;
cout << pa << endl;
cout << &a << endl;
cout << &pa << endl;
cout << *pa << endl; // 等价于cout<<a<<endl;
*&a;// 等价于a 单目运算符优先级一致,结合性为右结合性
&*pa;// 等价于pa。注意:*指针运算符只能用于指针变量
*pa = 6;// a=6; // 通过指针变量修改指向变量的值
int b = *pa; // 通过指针变量获取指向变量的值
int arr[4] = {12,35,64,72};
int* paa = &arr[0];
int* pab = &arr[3];
//
cout << paa << endl;
cout << paa + 1 << endl; // 指针偏移
cout << pab - paa << endl; // 两个地址之间的相差元素的个数
//pab + paa; 没有意义
int* parr = arr;
//parr++;// parr = parr+1 指针偏移
// 地址相同
cout << arr << endl;
cout << &arr[0] << endl;
cout << parr << endl;
// 内容相同
*(arr+0);
arr[0];
*(parr + 0);
parr++;
//arr++; 错误:arr表示数组的首地址,是常量
int arr2[4];
int* parr2;
for (parr2 = arr2; parr2 < arr2+4; parr2++)
{
cin >> *parr2;
}
parr2 = arr2;
for (int i = 0; i < 4; i++)
{
cout << *parr2++ << endl;
}
return 0;
}
6.指针遍历一维数组(作业)
1)通过键盘输入数组a的内容并输出
#include <iostream>
using namespace std;
int main()
{
int a[10], *p;
for (p = a; p < a + 10; p++)
{
cin >> *p;
}
for (p = a; p < a + 10; p++)
cout << *p << endl;;
return 0;
}
/****************** 任亚 ******************/
int aa[5] = {12,45,64,86,100};
int bb[5];
int *paaa = aa;
for(int i = 0; i<5;i++)
{
bb[i] = *paaa++;
}
//(1)遍历
for(int *pbbb = bb;pbbb<bb+5;pbbb++)
{
cout<<*pbbb<<" ";
}
cout<<endl;
//(2)遍历
for (int i = 0; i < 5; i++)
{
cout<<*pbbb<<" ";
}
cout<<endl;
2)将数组a的数据复制到数组b中并输出99
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
char a[100] = "\0", b[100] = "\0";
int i = 0;
cout<<"输入一行字符:"<<endl;
cin>>a;
for (i = 0; a[i] != '\0'; i++){
b[i] = a[i];
}
cout << b << endl;;
return 0;
}
/*************************************************/
#include <iostream>
#define n 10
int main()
{
int a[n], b[n], * p = a, * q = b, i;
for (i = 0; i < n; ++i)
{
cin>> p;
*q++ = *p++;
}
return 0;
}