就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。
先看下面的代码,注意看代码中的注解:
#include <iostream>
#include <string>
using namespace std;
void print_char(char* array[],int len);//函数原形声明
void main(void)
{
//-----------------------------段1-----------------------------------------
char *a[]={"abc","cde","fgh"};//字符指针数组
char* *b=a;//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\0字符串的首地址
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;
//-------------------------------------------------------------------------
//-----------------------------段2-----------------------------------------
char* test[]={"abc","cde","fgh"};//注意这里是引号,表示是字符串,以后的地址每加1就是加4位(在32位系统上)
int num=sizeof(test)/sizeof(char*);//计算字符串个数
print_char(test,num);
cin.get();
//-------------------------------------------------------------------------
}
void print_char(char* array[],int len)//当调用的时候传递进来的不是数组,而是字符指针他每加1也就是加上sizeof(char*)的长度
{
for(int i=0;i<len;i++)
{
cout<<*array++<<endl;
}
}
下面我们来仔细说明一下字符指针数组和指向指针的指针,段1中的程序是下面的样子:
char *a[]={"abc","cde","fgh"};
char* *b=a;
cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;
char *a[]定义了一个指针数组,注意不是char[], char[]是不能同时初始化为三个字符的,定义以后的a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串的起始地址,而这三个位置的内存地址却不是这三个字符串的起始地址,在这个例子中a[]是存储在栈空间内的,而三个字符串却是存储在静态内存空间内的const区域中的,接下去我们看到了char* *b=a;这里是定义了一个指向指针的指针,如果你写成char *b=a;那么是错误的,因为编译器会返回一个无法将char* *[3]转换给char *的错误,b=a的赋值,实际上是把a的首地址赋给了b,由于b是一个指向指针的指针,程序的输出cout<<*b<<"|"<<*(b+1)<<"|"<<*(b+2)<<endl;
结果是
abc
cde
fgh
可以看出每一次内存地址的+1操作事实上是一次加sizeof(char*)的操作,我们在32位的系统中sizeof(char*)的长度是4,所以每加1也就是+4,实际上是*a[]内部三个位置的+1,所以*(b+1)的结果自然就是cde了,我们这时候可能会问,为什么输出是cde而不是c一个呢?答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\0后停止.
我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成了,cout<<*array++<<endl;当然我们也可以改写为cout<<array[i]<<endl,这里在循环中的每次加1操作和段1代码总的道理是一样的,注意看下面的图!
到这里这两个非常重要的知识点我们都说完了,说归说,要想透彻理解希望读者多动手,多观察,熟能生巧。
下面是内存结构示意图:
[1] >>继续下一页
相关文章:
分享到:
相关推荐
注意,由于是宽字符数组,我们应使用`LPCWSTR`(常量宽字符指针)来处理每个字符串: ```cpp void ProcessStrings(int count, wchar_t** strings) { for (int i = 0; i ; i++) { wprintf(L"%ls\n", strings[i]);...
在C/C++编程语言中,字符数组和字符指针是非常重要的数据类型,尤其是在处理文本数据时。这两种类型的使用非常广泛,但在实际编程过程中,不少开发者往往会在它们之间产生混淆,导致程序出现错误。本文将详细介绍...
- **数组名与指针常量**:数组名在表达式中自动转换为指向数组第一个元素的指针常量。 - **不可改变的地址**:数组名中存放的地址是不可改变的,所以数组名称为指针常量。 - **丢失的数组信息**:使用数组名作为指针...
在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的数据类型(如整数、字符等),而是存储了一个内存地址。通过这个内存地址,我们...
在这个名为"C/C++指针的用法总结实例工程"的项目中,我们将深入探讨五种关键的指针相关概念,包括双重指针、引用、指针函数、指针数组以及数组指针,并通过实际的例子来帮助理解这些概念。 首先,让我们看看双重...
在IT领域,C和C++语言中的指针是至关重要的概念,它们是程序设计的基础,也是许多高级技术的基石。本资源包“C/C++指针经典资料大全”收集了多部经典教材,旨在帮助学习者深入理解并掌握指针的使用。 1. **指针基础...
指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一...使用指针数组中各元素分别指向若干个字符串,使字符串的处理更加灵活。 程序1.1 代码如下:#inclu
这里 `array++` 的操作使得 `array` 指向数组中的下一个元素。 #### 五、总结 - **数组指针** (`int (*p)[n];`): 是一个指向含有 `n` 个整型元素的一维数组的指针,主要用于处理二维数组。 - **指针数组** (`int *...
- 在`arrayTest`函数中,传入的数组名`str`被视为指向数组第一个元素的指针。 - `sizeof(str)`返回的是指针变量`str`的大小,通常是4或8字节。 #### 总结 通过上述讨论可以看出,虽然数组名在某些上下文中表现得像...
C++指针及数组应用 C++中的指针类型是一个非常重要的概念,它是C++语言的基础之一。指针类型可以分为两种:静态指针和动态指针。静态指针是指在编译时就确定了内存地址的指针,而动态指针是指在运行时才确定了内存...
在C++编程语言中,数组和指针是两个非常重要的概念,它们在处理大量数据时发挥着关键作用。数组提供了一种方式来存储同一类型的多个数据项,而指针则是指向这些数据项的地址,使得我们可以高效地访问和操作数组。 ...
这里`pf`是一个指向一个包含三个元素的数组的指针,每个元素都是指向一个函数的指针,这些函数接受一个字符指针作为参数,并返回一个字符指针。 接着看具体的实现: ```cpp char* fun1(char *p) { /* ... */ } ...
qsort函数接受四个参数,其中base指向数组的起始地址,nelem表示数组中元素的数量,width表示数组中每个元素的字节数,pfCompare是一个函数指针,指向用于比较两个元素的函数。这个比较函数必须符合特定的签名,并...
C/C++指针是编程语言中的一种基本数据类型,它们可以指向内存中的地址,可以存储变量的值,也可以存储函数的地址。指针的使用可以提高程序的效率和灵活性,但是也增加了程序的复杂度和出错的可能性。 ...
例如,在C/C++中,`int *`指针可以指向一个整数的地址,而`char *`指针则指向一个字符的地址。 ##### 示例分析 考虑以下示例代码: ```c int m = 10; char *p = (char *)&m; float *f = (float *)&m; short *s = ...
根据给定的信息,本文将对“字符串与指针”这一主题进行深入解析,重点围绕C/C++编程语言中的实现方式及应用技巧。 ### 字符串与指针的关系 #### 一、基本概念介绍 在C/C++语言中,字符串本质上是由字符组成的...
例如,如果我们有一个数组`int arr[5]`,那么`arr`就是一个指向数组第一个元素的指针,即`int* arr`。这意味着,我们可以使用指针运算符`[]`来访问数组元素,如`*(arr + 2)`等价于`arr[2]`。 字符串在C++中通常是以...
二维数组在C++中本质上是一级指针的数组,每个元素又是一个一级指针,指向一维字符数组。因此,二级指针可以用来直接访问和修改这些一维数组的内容。下面将详细解释这个过程: 1. **二级指针的声明**: 在C++中,...
- C++中的字符串数组可能表现为`char**`或`wchar_t**`,每个元素指向一个字符串。在C#中,我们可以使用固定大小的数组或`StringBuilder`数组来模拟这种行为。 - 如果C++的DLL接受一个字符串数组,例如: ```cpp ...