繁体   English   中英

关于C中的指针和更改内存地址中的数据感到困惑

[英]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是指针,而barfoo指向的成员的名称。

您还可以对指针执行算术运算。 如果ptr是指向数组元素的指针,则ptr + 1指向数组的下一个元素, ptr + 2指向之后的元素,依此类推。

[]数组索引运算符实际上是根据指针算术定义的。 ptr[2]含义与*(ptr+2)完全相同。 将其与以下事实结合起来:在大多数情况下,数组名称会衰减为指向数组第一个元素的指针,并且稍加思考,您就会看到arr[2]是如何指arrarr的第三个元素的(第三个因为索引从0开始)。

我强烈建议comp.lang.c FAQ的第4节(指针)和第6节(数组和指针); 它可能会比我解释得更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM