深入解析C++中的指针数组与指向指针的指针_C 语言

指针数组
定义:
如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址。

形式:
一维指针数组的定义形式为:
int【类型名】 *p【数组名】 [4]【数组长度】;
由于[ ]比*优先级高,因此p先与[4]结合,形成p[4]的数组的形式。然后与p前面的“ * ”结合,“ * ”表示此数组是指针类型的,每个数组元素都相当于一个指针变量,都可以指向整形变量。

注意:不能写成int (*p)[4]的形式,这是指的一个指向一维数组的指针变量。
使用指针数组中各元素分别指向若干个字符串,使字符串的处理更加灵活。

程序1.1

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 void sort(char *p[],int n);
 void print(char *p[],int n);
 char *name[]={"C","C++","PHP","ASP","ASP.NET","C#","JAVA","BASIC","PASCAL","COBOL"};
 int n=10;
 sort(name,n);
 print(name,n);
 return 0;
}
void sort(char *p[],int n){
 char *temp;
 int i,j,k;
 for(i=0;i<n;i++){
  k=i;
  for(j=i;j<n;j++){
   if(strcmp(p[j],p[k])<0){
    k=j;
   }
  }
  if(k!=i){
      temp=p[k];
      p[k]=p[i];
      p[i]=temp;
  }
 }
}
void print(char *p[],int n){
 int i;
 for(i=0;i<n;i++){
  cout<<p[i]<<endl;
 }
}

分析:
在main函数中定义了指针数组name,它的十个元素分别是字符串

复制代码 代码如下:

"C","C++","PHP","ASP","ASP.NET","C#","JAVA","BASIC","PASCAL","COBOL"

的起始地址。然后将数组的首元素的地址传到函数sort中p数组中,因此形参p和实参name指向的是同一个数组。然后用选择法对数组进行了排序。

print函数的作用,是输出各字符串,p[0]~p[9]分别是各字符串的首地址。

print函数还可以改写成一下形式:

复制代码 代码如下:

void print(char *p[],int n){
    char *q=p[0];
    int i=0;
    while(i<n){
     q=*(p+i++);
     cout<<q<<endl;
    }
}

指向指针的指针

定义:
指向指针数据的指针就是指向指针的指针,例如在程序1.1中的main函数中定义的指针数组name[10],

复制代码 代码如下:

char * *p=name

就表示把指针数组的首个指针元素的地址赋给指向指针的变量p;

程序1.2

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
 char *name[]={"C","C++","PHP","ASP","ASP.NET","C#","JAVA","BASIC","PASCAL","COBOL"};
 char * *p;
 p=name+2;
 cout<<p<<endl;
 cout<<*p<<endl;//等价于name[2]
 cout<<* *p<<endl;
 return 0;
}

分析:
p是指向指针的指针,也就是存放的name[2]的地址的值;
*p是指针,也就是name[2]的值(指针数组中的元素);
* *p是指针指向的数据的值,因为定义的p是指向char类型的数据,所以结果输出第一个字符。

时间: 2024-09-17 04:10:18

深入解析C++中的指针数组与指向指针的指针_C 语言的相关文章

深入解析C++中的字符数组和处理字符串的方法_C 语言

C++字符数组 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符.字符数组具有数组的共同属性.由于字符串应用广泛,C和C++专门为它提供了许多方便的用法和函数. 字符数组的定义和初始化 定义字符数组的方法与前面介绍的类似.例如: char c[10]; c[0]=′I′;c[1]=′ ′;c[2]=′a′;c[3]=′m′;c[4]=′ ′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′; 上面定义了c为字符数组,包含10个元素.在赋值

C语言 指针数组详解及示例代码_C 语言

如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般为: dataType *arrayName[length]; [ ]的优先级高于*,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *. 除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子: #include <stdi

解析C++中四种强制类型转换的区别详解_C 语言

C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型.那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换.C++中风格是static_cast<type>(content).C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干

解析C++中的虚拟函数及其静态类型和动态类型_C 语言

虚拟函数是C++语言引入的一个很重要的特性,它提供了"动态绑定"机制,正是这一机制使得继承的语义变得相对明晰. (1)基类抽象了通用的数据及操作,就数据而言,如果该数据成员在各派生类中都需要用到,那么就需要将其声明在基类中:就操作而言,如果该操作对各派生类都有意义,无论其语义是否会被修改或扩展,那么就需要将其声明在基类中. (2)有些操作,如果对于各个派生类而言,语义保持完全一致,而无需修改或扩展,那么这些操作声明为基类的非虚拟成员函数.各派生类在声明为基类的派生类时,默认继承了这些非

解析C++中构造函数的默认参数和构造函数的重载_C 语言

C++构造函数的默认参数 和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. [例] #include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数 int volume( ); private : int height; int width; int l

深入解析C++中的函数模板和函数的默认参数_C 语言

C++函数模板 我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值.这就是数据的参数化. 其实,数据类型也可以通过参数来传递,在函数定义是可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的参数自动确定数据类型.这就是数据类型参数化. 所谓函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替(实际上是用一个标识符来占位).这个通用函数就称为函数模板(Function Template).凡是函数

解析wprintf 中使用%I64d格式化输出LONGLONG的详细介绍_C 语言

wprintf 中使用%I64d格式化输出LONGLONG 在写某个程序时,因为需要用到一个大的整数,就是要了LONGLONG型: 复制代码 代码如下: LONGLONG nLarge; 但是格式化时不知道应该用什么字符,用 %d,%l都不行.LONGLONGLONGLONG其实就是int64类型.在winnt.h可以看到: 复制代码 代码如下: typedef __int64 LONGLONG; 所以要想输出就要看__int64使用什么格式符了.通过查MSDN中,发现是:I64.在格式化输出则

解析c中stdout与stderr容易忽视的一些细节_C 语言

先看下面一个例子a.c : 复制代码 代码如下: int main(int argc, char *argv[]){ fprintf(stdout, "normal\n"); fprintf(stderr, "bad\n"); return 0;} $ ./anormalbad$ ./a > tmp 2>&1$ cat tmpbadtmp我们看到, 重定向到一个文件后, bad 到了 normal 的前面.原因如下: 复制代码 代码如下: &qu

C/C++中字符指针数组及指向指针的指针的含义

就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针. 先看下面的代码,注意看代码中的注解: #include <iostream>#include <string>using namespace std; void print_char(char* array[],int len);//函数原形声明void main(void){//-----------------------------段1----------

C语言 指针数组 和 指向指针的指针

指针数组 指针数组是一种特殊的数组,这类数组存放的全部是同一数据类型的内存地址.指针数组的定义形式为:     数据类型 *数组名[长度]; 例如: const char *c[4] = { "China", "USA", "Rassia", "Japan" }; // 定义长度为 4 的常量字符型指针数组,将数组元素分别指向 4 个 字符串常量 int i;for (i = 0; i < 4; i++){    put