指针和引用(3)指针数组和数组指针

1.知识点

1.1指针数组——存放指针的数组

(1)指针数组本质上是一个数组,指针是数组中的内容,表示数组中的每个元素都是指针,因此指针数组就是存放指针的数组。下面是指针数组的用法:

1 int a = 10, b = 20;
2 int *p[3];
3 p[0] = &a;
4 p[2] = &b;

(2)指针数组的定义可以抽象为:指向变量类型 * 数组名称[数组长度]。

(3)[]的优先级高于*,所以[]与p先结合,说明p是一个数组,长度为3,其数组元素的类型是int *。

1.2数组指针——指向数组的指针

(1)数组指针本质上是一个指针,数组是指针指向的类型,表示指针指向一个数组,因此数组指针就是指向数组的指针。下面是数组指针的用法:

1 int a[3] = { 1,2,3 };
2 int (*p)[3];
3 p = &a;

(2)数组指针的定义可以抽象为:数组元素类型 (* 指针名称)[数组长度]。

(3)()使得*与p先结合,所以p是一个指针,盖掉(*p)剩下的就是指针指向的内容了即int[3]。

(4)数组指针指向整个数组a(取地址&a),而非数组a的首元素(取地址a),虽然数组a和数组a中首元素的地址相同。

2.面试题

2.1简述数组指针与二维数组的区别

请写出下面程序的输出结果(假设数组a的地址&a为0x001DF720)

 1 int main(int argc, char *argv[]) {
 2     //数组指针和二维数组的区别
 3     int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} };
 4     int(*p)[5] = a;
 5     cout << p << endl;
 6     cout << p + 1 << endl;
 7
 8     cout << *p << endl;
 9     cout << *(p + 1) << endl;
10     cout << *p + 1 << endl;
11
12     cout << **p << endl;
13     cout << **(p + 1) << endl;
14     cout << *(*p + 1) << endl;
15
16     getchar();
17     return 0;
18 }

知识点提示:(1)数组名始终等价于数组首元素的地址:a<=>&a[0]。

(2)解引用的次数等于数组的维度时,才能得到数组的元素值,如二维数组必须经过两次解引用才能得到数组的元素值。

(3)数组首元素地址和数组的地址虽然位置一样,但是二者完全不是一回事(通过解引用来理解),数组首元素地址&a[0]解引用之后为*(&a[0])=a[0],是首元素的值;而数组地址&a解引用之后为*(&a)=a=&a[0];通过以上说明,数组地址一次解引用之后得到数组首元素的地址,再解引用之后得到首元素的值(在一维数组的情况下)。

(4)二维数组a[n][m],可以把a[n]看成是内层[m]的数组名。

按照以上的知识和规则认真分析可以得出如下答案:

 1 //数组a的地址&a为0x001DF720
 2  int main(int argc, char *argv[]) {
 3      int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} };
 4      int(*p)[5] = a;//a==&a[0],左右类型相同,p指向一个元素为5的一维数组
 5      cout << p << endl;//两次解引用是地址,p=&a[0],0x001DF720
 6      cout << p + 1 << endl;//两次解引用是地址,p+1=&a[1]=0x001DF720+4*5=0x001DF734
 7
 8      cout << *p << endl;//一次解引用是地址,*p=a[0]=&a[0][0],0x001DF720
 9      cout << *(p + 1) << endl;//一次解引用是地址,*(p+1)=a[1]=&a[1][0],0x001DF734
10      cout << *p + 1 << endl;//一次解引用是地址,*p+1=&a[0][1]=0x001DF724
11
12      cout << **p << endl;//二次解引用是元素值,**p=a[0][0]=1
13      cout << **(p + 1) << endl;//二次解引用是元素值,**(p+1)=a[1][0]=6
14      cout << *(*p + 1) << endl;//二次解引用是元素值,*(*p+1)=a[0][1]=2
15
16      getchar();
17      return 0;
18  }

2.2简述数组地址和数组首地址的区别

指出下面程序中的错误:

1 int main(int argc, char *argv[]) {
2     int b[6] = { 1,2,3,4,5,6 };
3     int *p = &b;  //左右类型不匹配
4     cout << p << endl;
5
6     getchar();
7     return 0;
8 }

知识点:数组首元素地址和数组的地址虽然位置一样,但是二者完全不是一回事(通过解引用来理解),数组首元素地址&a[0]解引用之后为*(&a[0])=a[0],是首元素的值;而数组地址&a解引用之后为*(&a)=a=&a[0];通过以上说明,数组地址一次解引用之后得到数组首元素的地址,再解引用之后得到首元素的值(在一维数组的情况下)。

修改方式以下二选其一:

1 //方式一
2 int (*p)[6]=&b;
3 //方式二
4 int *p=b;//或者:int *p=&b[0];

2.3简述指针数组与指向指针的指针的区别

写出指针数组str中四个指针元素的值。

由于题目有问题,未正确解答,故略。

原文地址:https://www.cnblogs.com/ys99/p/9195371.html

时间: 2024-08-24 12:17:19

指针和引用(3)指针数组和数组指针的相关文章

指针的指针,指针的引用(不是二维指针)

详解c++指针的指针和指针的引用 展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) {

More Effective C++----(1)指针与引用的区别 &amp; (2)尽量使用C++风格的类型转换 &amp; (3)不要对数组使用多态

Item M1:指针与引用的区别 指针与引用看上去完全不同(指针用操作符"*"和"->",引用使用操作符". "),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空

详解c++指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

C++ 指针与引用 知识点 小结

[摘要] 指针可以指向变量.数组.字符串.函数.甚至结构体.即指针可以指向不同数据对象.指针问题 包括 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等.主要知识点包括:1.指针与引用在概念上的三个区别及其在const.sizeof.自增运算上的差异:2.熟记经典swap函数的指针实现与引用实现,并能反映输出错误的两个函数的思想弊端:3.熟记GetMem函数的错误形式以及错误产生的原因:4.比较数组.指针与静态变量作为函数返回值的差异:5.str.*str以及&str三者

无效的指针、引用和迭代器

首先以示例代码为例: vector<int> v; //添加一些元素 fir(int i=0; i<10; ++i) v.push_back(i); int* my_favorite_element_ptr = &v[3]; cout<<"My favorite element = "<<(*my_favorite_element_ptr)<<endl; cout<<"Its address = &qu

指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题 int m_value = 1; void func(int *p) { p = &m_value; } in

详解指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

C++ 中指针与引用的区别

指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名.     ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化

C/C++:提升_指针的指针和指针的引用

C/C++:提升_指针的指针和指针的引用 ◇写在前面 今天在使用指针的时候我发现了一个自己的错误. 我刚开自以为是觉得输出的两个P都是6,当时觉得两个p所指的地址相同,要修改就都修改了. 这是一个很低级的错误,两个p所指的地址相同,但是这两个指针的地址是不一样的. 好比两个人都知道火车站怎么走,但不能说这两个人是一个人,更何况在修改中一个人已经忘了火车站,它只知道高铁站怎么走,那另一个只知道火车站的并没有受到影响,他还是只知道火车站. 好了,那么如何做到main修改里面的p呢?要用到两种技术:

指针和引用的区别(c/c++)

http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5.