您的位置:首页 > 编程语言 > C语言/C++

C/C++学习笔记之指针(1)

2020-03-28 20:03 701 查看

一.指针相关概念

1.指针变量的声明:

任意数据类型 (int/string/char等) *标识符(ptr等),比如 int *ptr 定义了一个纸指向int型数据的指针变量。指针数组:数组的每个元素都是指向同一类型的指针,格式:数据类型 *数组名[下标表达式],下标表达式指出数组元素的个数,数组名是这个数组的首地址,数组名是指针常量,比如 int *pa[3]。
关于指针类型的补充:

(1) 指向常量的指针:

int a; 	const int *b=&a; 	int c; 	b=&c;//正确,指针b本身的内容可以改变 	*b=1;//编译出错,b指向的内容不能改变

(2)指针类型的常量:

int *const b=&a; 	b=&c;//出错,b本身的内容不能改变

指针没有初始化就赋值是相当危险的,因为它指向内存中一个随机地址。

(3)指向类的非静态成员的指针

可以使指针直接指向对象的成员,进而通过指针访问对象的成员。声明形式:
类型说明符 类名::*指针名
类型说明符 (类名::*指针名)(参数表)
访问数据成员时形式:
对象名.*类成员指针名
对象指针名->*类成员指针名

#include <iostream>
using namespace std;

class Test{

int x,y;
public:
Test(int i,int j=0){
x=i;y=j;}
int get(int i,int j){

return i+j;
}
};

void main(){

Test t1(2),t2(4,6);
int (Test::*p)(int ,int=10);//指针声明
p=Test::get;//指针名赋值
cout<<(t1.*p)(5)<<endl;
Test *p1=&t2;
cout<<(p1->*p)(7,20)<<endl;
}

结果:
15
27

2.指针的赋值

2.1.两个运算符:

*和&,*ptr表示指针ptr所指向的数据的值,&i表示变量i的存储单元地址。注意:这两个符号出现的声明语句中和执行语句中其含义是不同的,他们作为一元运算符和二元运算符时的含义也是不同的。*出现在声明语句中时,表示声明的是指针,出现在声明语句的初始化表达式中或执行语句中时,表示访问指针所指对象的内容。&出现在声明语句中被声明变量的左边时表示声明的是引用,出现在赋值语句中时表示取对象的地址。

2.2.赋值

定义指针的同时赋值:数据类型 * 指针名=初始地址,定义之后单独使用赋值:指针名=地址。

3.指针的运算

3.1.指针直接运算

3.2.指针和数组(一维和二维数组)

`int main(){

int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p=a;

cout<<p<<" "<<endl;//1
cout<<*p<<endl;//0018FF20

int i,j;

int array[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int *ptr[3]={array[0],array[1],array[2]};

cout<<"指针:"<<endl;
for(i=0;i<3;i++){

for(j=0;j<3;j++){

cout<<ptr[i][j]<<" ";

}
cout<<endl;
}

cout<<"二维数组:"<<endl;
for(i=0;i<3;i++){

for(j=0;j<3;j++){

cout<<*(*(array+i)+j)<<" ";

}
cout<<endl;
}

return 0;

}`
运算结果:

如果将指针初始化(*p)[3]=b,地址等价形式:p+i、p[i]、*(p+i)都表示b数组第i+1行的第一个元素的首地址。*(p+i)+j、p[i]+j、&p[i][j]都表示b数组的第i+1行、第j+1列元素的地址。值的等价形式:*(*(p+i)+j)、*(p[i]+j)、p[i][j都表示b数组的第i+1行、第j+1列元素的值。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
不愿当码农 发布了14 篇原创文章 · 获赞 0 · 访问量 322 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: