一道关于指针数组的面试题

  指针数组:指针的数组,表示一个数组,并且数组的每一个元素都是指针类型。

  数组指针:数组的指针,表示一个指针,并且是指向数组的指针。

看看下面每行的分析,学习啦~

[cpp] view plain copy

  1. #include <iostream>
  2. using namespace std;
  3. int main ( )
  4. {
  5. char *str[]={"welcome","to","fortemedia","Nanjing"};
  6. char * * p=str+1;     //p指向 "to"字符串地址
  7. str[0]=(*p++) +2;          //str[0]指向‘\0‘;           然后p后移 p=str[2]
  8. str[1]=*(p+1);            //p+1后 p+1 = str[3];   然后 str[1] = str[3]
  9. str[2]=p[1]+3;             //str[2]指向str[3]的从0开始数的第三个 str[2]指向"jing"地址
  10. str[3]=p[0]+(str[2]-str[1]);  //str[3]指向从p[0]开始(也就是*p,也就是str[2])的 偏移量为(str[2]-str[1])的地址~ str[2]指向"jing",str[1]指向str[3],也就是"Namjing",所以str[3]指向"jing"的"g"地址
  11. printf("%s\n",str[0]);
  12. printf("%s\n",str[1]);
  13. printf("%s\n",str[2]);
  14. printf("%s\n",str[3]);
  15. return 0;
  16. }

[cpp] view plain copy

  1. int main()
  2. {
  3. char *str[] = {"Welcome","to","Fortemedia","Nanjing"};
  4. char **p = str + 1;
  5. str[0] = *p++;
  6. //{"to","to","Fortemedia","Nanjing"};
  7. str[1] = *(p+1);
  8. //{"to","Nanjing","Fortemedia","Nanjing"};
  9. str[2] = p[1] + 3;
  10. //{"to","Nanjing","jing","Nanjing"};
  11. str[3] = p[0] + (str[2] - str[1]);
  12. //str[2]-str[1]是原来的指向Nanjing中的j的指针减去Nanjing中的N的指针,当然是3了
  13. //p[0] 是指向"jing"中的j的,再加3就是g了
  14. printf("%s\n",str[0]);
  15. printf("%s\n",str[1]);
  16. printf("%s\n",str[2]);
  17. printf("%s\n",str[3]);
  18. return 0;
  19. }
时间: 2024-10-15 22:21:53

一道关于指针数组的面试题的相关文章

javascript基础修炼——一道十面埋伏的原型链面试题

javascript基础修炼--一道十面埋伏的原型链面试题 在基础面前,一切技巧都是浮云. 题目是这样的 要求写出控制台的输出. function Parent() { this.a = 1; this.b = [1, 2, this.a]; this.c = { demo: 5 }; this.show = function () { console.log(this.a , this.b , this.c.demo ); } } function Child() { this.a = 2;

校招笔试复习——指针数组与数组指针

一.先看一组定义 1.一个整型数   int a; 2.一个指向整型数的指针    int *a; 3.一个指向指针的指针,它指向的指针指向一个整型数    int **a; 4.一个有5个整型数的数组    int a[5]; 5.一个有5个指针的数组,该指针指向一个整型数    int *a[5]; 6.一个指向有5个整型数数组的指针   int (*a)[5]; 7.一个指向函数的指针,该函数有一个整型参数并返回一个整型数    int (*a)(int); 8.一个有5个指针的数组,该指

上海华为的一道关于指针方面的编程题(C/C++)

int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标. 尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路 注:我的方法的复杂度为O(n),大家如果有其它方法希望可以交流一下. /* author: jiangxin Blog: http://blog.csdn.net/jiangxinnju */ #include <ios

指针和引用(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数

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

数组指针和指针数组的区别

数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数据的长度. 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组. p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是

指针数组 数组指针

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针 数组指针:a pointer to an array,即指向数组的指针 还要注意的是他们用法的区别,下面举例说明. int* a[4]     指针数组 表示:数组a中的元素都为int型指针 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于* int (*a)[4]   数组指针 表示:指向数组a的指针 元素表示:(*a)[i] 注意:在实际应用中,对于指针数组,我们经常这样使用: 1

C语言学习笔记(6):如何从变量声明的表面上来区分指针数组和数组指针

举例:int *p[5]是指针数组int (*p)[5]是数组指针区分两者只要看变量名p周围的修饰符即可. 这里要明确两点:1.不论int *p[5]还是int (*p)[5]都不应该看成一个整体,而应该看成一些修饰符来修饰变量p,从而使p得到准确定义:2.[]的优先级要比*高,相同优先级修饰符,采取从左向右的编译方式. *p[5]由于[]优先级高所以[]先修饰变量名p,所以p是一个数组名,然后再看其它修饰符,可以发现是一个int * 类型的数组,即p为指针数组. (*P)[5]由于()和[]两