0

我想如果有人能在我正在进行的当前项目中帮助我,我会更好地理解这个概念。我想使用 C 使用指针编辑特定内存地址的数据。具体来说,我有两个字符数组(字符串),我既需要从特定位置读取数据,也需要在特定位置写入数据。

我主要对指针的语法感到困惑,例如*and->&

据我了解,*指的是保存在指针当前内存地址的数据。因此,例如,如果我想编辑 a 的起始内存地址处的数据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!”

4

2 回答 2

3

如果您要处理的是一个字符数组(确实如此),请使用数组语法:

pnew_string[j+1] = poriginal[j+1];

请注意,此语法等效于:

*(pnew_string + j + 1) = *(poriginal + j + 1);

但更具可读性。

鉴于此示例,处理您遇到的大多数其他情况应该是显而易见的。

于 2013-02-09T02:43:02.880 回答
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

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

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

我强烈推荐comp.lang.c FAQ的第 4 节(指针)和第 6 节(数组和指针);它可能会比我更好地解释这些东西。

于 2013-02-09T03:01:46.123 回答