2010-02-25 104 views
7

我读the following text from Stanford's Programming Paradigms class,我注意到,当笔者使用string类的构造函数的函数调用,看起来像这样:小学C++类型混淆

string::string(const char* str) { 
    initializeFrom(str, str + strlen(str)); 
} 

如果initializeFrom函数有两个char *参数,第二个参数怎么会传递一个(char * + int)到一个char *并让它正常工作?类型系统如何解释这个陈述?

在此先感谢。

+0

'strlen()'实际上返回一个'size_t',而不是'int'。其中一个重要的区别是'size_t'是一个无符号类型,即它只能保持正数。这是有道理的 - 字符串长度可以是0,1或30000个字符,但从不是-7。 – MSalters 2010-02-25 08:54:56

回答

11

这就是所谓的指针算术。 char * + int会导致char *在内存中的int值更高。

+1

+1用于正确命名。 :) – 2010-02-25 02:31:53

+0

如果'int'是-ve,它在内存中可能会更低;所以它应该是一个'unsigned int',结果在内存中总是* always *。 [对不起,如果这是挑剔;] – legends2k 2010-02-25 02:55:42

+0

@ legends2k这是真的,虽然strlen()不应该返回一个负值,所以在这里分析的特定代码将导致第二个参数总是大于或等于第一个。 – ChrisH 2010-02-25 03:07:37

0

第一个参数指向char数组的开始,第二个参数指向char数组末尾的NULL char。

const char *str = "abc"; 
char *start = str; // start now points to the first char. 
char *end = str + strlen(str); // end now points to the null char at the end. 

您可以通过印刷证实了这一点:

printf("%c %d",*start,*end); // will output: a 0 
0

怎么来的第二个参数可以通过一个(字符* + INT)

它仍然是传递一个char *指点到strlen(str)过去最初指出的位置。

2

请记住,指针只是一个保存内存地址的变量。所以你可以将值添加到内存地址。内存地址是一个数字。

当您将1添加到某个类型的指针时,它实际上会添加1 * sizeof(type)。当你添加任何值N时,它实际上会添加N * sizeof(type)。

考虑下面的例子:

int x[5] = {0,1,2,3,4}; 
int *p = &(x[0]);//point to the first element 
p = p + 1;//p now points to the second element. 
4

二进制加法运算符+-时可以使用一个参数是一个指向任何完整的类型(比如,T* p)和其他参数的整数(比如, i)。他们实现了所谓的指针运算

编译器假定指针指向某个数组的元素(例如,T array[N])。该操作会生成一个指向数组另一个元素的指针,该元素与原始元素相距i个元素。可以在任一方向上“移动”指针,即朝向阵列的开始或朝向阵列的末尾。例如,如果p指向array[3],则p + 4将指向array[7]

该操作仅在结果指向数组的现有元素或超过数组的最后一个元素时有效,即给定数组T array[N],可以创建指向元素从array[0]到虚数元素的指针array[N]。任何使用指针算术来跨越这些界限的尝试都会导致未定义的行为。

类型T必须是完整的,这意味着指针运算不能与void *指针被用于一个示例中,即使一些编译器允许此作为一个扩展(处理void *指针作为相当于char *指针)。

除了二进制加法运算符,指针运算也包括前缀和后缀的一元++--运算符(应用到指针)以及化合物赋值运算符+=-=(与它们的左手侧和整数上的指针右侧)。

在你的情况下,str + strlen(str)表达式将产生一个指针char *类型,指向终止\0字符串str

0

我认为这可能是过度的回答。

在:

initializeFrom(str, str + strlen(str)); 

str是一个指针串的开始。

(str + strlen(str))是一个指向字符串末尾的指针。

请记住str(字符指针)只是一个整数((int),(long),(long long),具体取决于体系结构),用于标识内存中的位置。

+0

指针不是(总是)一个整数。例如,在x86-16上,它是一对整数。 – MSalters 2010-02-25 08:57:51