[英]Confused About Pointers in C and changing data at memory addresses
我认为,如果有人可以在我正在进行的当前项目中为我提供帮助,我会更好地理解这个概念。 我想使用C使用指针来编辑特定内存地址处的数据。 具体来说,我有两个字符数组(字符串),既需要从特定位置读取数据,又要在特定位置写入数据。
我对指针的语法非常困惑,例如*
和->
和&
。
据我了解, *
是指保存在指针当前内存地址中的数据。 因此,例如,如果我想在char *p
的开始存储地址处编辑数据,我将执行以下操作: (*p) = 'c';
现在,如果我想从p
的开头更改第二个存储器地址处的字符怎么办?
另外,我了解&
指的是指针的位置。 但是我不知道如何使用这种语法。
这是我的示例:
int orig_length = strlen(original_string); //-1 for \0?
char *poriginal, *pnew_string;
poriginal = &original_string;
while(orig_length>0) {
k = 0;
j = 0;
while(isalpha(*(poriginal+j))) {
j++;
k++;
}
while(k > 0) {
*(pnew_string+(j-k)) = toupper(*(poriginal+k-1)); //toupper
k--;
}
if(*(poriginal+(j)) == '_') {
*(pnew_string+(j)) = ' ';
}
else {
*(pnew_string+(j)) = *(poriginal+(j));
}
orig_length = orig_length - j;
}
*(pnew_string+strlen(pnew_string)) = '\0'; //Syn? Is this actually necessary?
... //program continues...
顺便说一句,该程序应采用一个字符串“ now_i_understand!”。 并反转每个字词,将每个字词大写,将_切换为'',然后不理会其他标点符号:“ WON I DNATSREDNU!”
如果您要处理的是一个字符数组(就是这样),请使用数组语法:
pnew_string[j+1] = poriginal[j+1];
请注意,此语法等效于:
*(pnew_string + j + 1) = *(poriginal + j + 1);
但更具可读性。
在这个例子中,处理您遇到的大多数其他情况应该是显而易见的。
*
和&
运算符彼此相反。 指针对象在内存中保存其他某个对象的地址 (或者旧指针为空指针 ,该指针不指向任何对象)。
一元*
运算符采用指针操作数,并为它提供指向的对象; 这称为取消引用 。
一元&
运算符采用引用任何类型对象的操作数,并为您提供指向该对象的指针。 &
是运算符的地址 。
例如:
int obj = 42; /* obj is an object of type int; it currently holds the value 42 */
int *ptr; /* ptr is a pointer to an int */
ptr = &obj; /* ptr now holds the address of obj */
printf("obj = %d\n", obj); /* prints 42 */
printf("*ptr = %d\n", *ptr); /* also prints 42; *ptr is another name for obj */
->
运算符是取消引用指针并访问其指向的成员的简写。 前缀必须是指向结构或联合的指针。 foo->bar
与(*foo).bar
含义相同,其中foo
是指针,而bar
是foo
指向的成员的名称。
您还可以对指针执行算术运算。 如果ptr
是指向数组元素的指针,则ptr + 1
指向数组的下一个元素, ptr + 2
指向之后的元素,依此类推。
[]
数组索引运算符实际上是根据指针算术定义的。 ptr[2]
含义与*(ptr+2)
完全相同。 将其与以下事实结合起来:在大多数情况下,数组名称会衰减为指向数组第一个元素的指针,并且稍加思考,您就会看到arr[2]
是如何指arr
组arr
的第三个元素的(第三个因为索引从0
开始)。
我强烈建议comp.lang.c FAQ的第4节(指针)和第6节(数组和指针); 它可能会比我解释得更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.