标签: pointer-arithmetic

将数字与指针相加

#include<stdio.h>
int main()
{  
     float a=10;
     float* p=&a;
    printf("%u\n",p);
     p=p+3;
     printf("%u",p);
}
Run Code Online (Sandbox Code Playgroud)

执行该程序后,我得到 2 个内存地址作为输出,后者的值比前者大 12。

#include<stdio.h>
int main()
{  
     float a=10;
     float* p=&a;
    printf("%u\n",p);
     p=p+3.5;
     printf("%u",p);
}
Run Code Online (Sandbox Code Playgroud)

我尝试将 3 更改为 3.5,但得到的输出具有两个地址的相同值。我预计在这两种情况下该值都会至少增加 12。可能是什么原因 ?

c pointers pointer-arithmetic

2
推荐指数
1
解决办法
1万
查看次数

使用 scanf() 时的指针数组

在我的代码中,我使用了这样的指针数组。

arr = (int*)malloc(N * sizeof(int));

        for (i = 0; i < N; i++)
            scanf("%d", (arr + i));
Run Code Online (Sandbox Code Playgroud)

因为指针算术指向地址。

但我想知道只写 (arr+i) 而没有 * 或 & 是否正确。

什么是对的?

请帮我。

c arrays pointers scanf pointer-arithmetic

2
推荐指数
1
解决办法
44
查看次数

指针过去式变量

据我所知,在 C 中检查指针是否是数组末尾的一个元素是完全合法的,如下所示:

char arr[16];

for (char* ptr = arr; ptr != arr + (sizeof arr / sizeof arr[0]); ++ptr) {
   // some code
}

Run Code Online (Sandbox Code Playgroud)

我的问题是,做这样的事情是否定义明确且合法(请注意,这段代码只是一个例子来表明我的观点。在实际代码中,我有处理数组的函数,我想知道我是否可以只传递指向本地 char 变量的指针和尺寸 1):

char c;
for (char* ptr = &c; ptr != (&c + 1); ++ptr) {
   // some code
}
Run Code Online (Sandbox Code Playgroud)

c for-loop pointer-arithmetic

2
推荐指数
1
解决办法
59
查看次数

不使用 * 操作符 hack-y 方式获取产品

有人可以帮助我理解以下逻辑如何解决获得a和 的产品b吗?

int getProd(int a, int b){
    return (uintptr_t)&((char (*) [a])0x0)[b];
}
Run Code Online (Sandbox Code Playgroud)

c pointer-arithmetic null-pointer

2
推荐指数
1
解决办法
112
查看次数

为什么2个地址之间的差异不是元素大小的倍数

我不明白为什么 var 是 6,它是如何计算的

#include <iostream>
using namespace std;
  
int main()
{
    char *A[] = { "abyx", "dbta", "cccc"};
    int var = *(A+1) - *A+1;
    cout << "1: " << (*(A+1)) << "\n";
    cout << "2: " << (*A+1) << "\n";
    cout << "char: " << var << "\n";
    cout << &A[0][1] - &A[1][0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers pointer-arithmetic chararray

2
推荐指数
1
解决办法
117
查看次数

C++指针算术怪异

我发现了我的错误(几个小时后),并在以下程序中将其隔离.问题在于使用指向结构的指针时计算pst2变量值的方式.当使用指向char的指针时,一切正常.为什么是这样?
(使用gcc/g ++版本:( Debian 4.4.5-8)4.4.5)
(对于那些想知道的人:我正在访问包含常规偏移量的数据分组的文件缓冲区.)

#include <iostream>
#include "testpa.h"

#pragma pack(push)
#pragma pack(1)
//---------------------------
struct st_one
{
    int i;
    char c;
};
//---------------------------
struct st_two
{
    long l;
    int i;
};
#pragma pack(pop)

//===========================
int main()
{
    int n=1024, np1=sizeof(st_one); //, np2=sizeof(st_two);
    st_one *pst1, *pst1a;
    st_two *pst2, *pst2a;
    char *pc1, *pc2, *pc1a, *pc2a, *pb;

    pb = new char[n];

    pst1 = (st_one*)(pb);
    pst2 = (st_two*)(pst1 + np1); //using pst1
    pc1 = (char*)(pb);
    pc2 = (char*)(pc1 + np1); //using pc1

    pst1a …
Run Code Online (Sandbox Code Playgroud)

c++ pointer-arithmetic

1
推荐指数
1
解决办法
357
查看次数

在c中创建我自己的memset函数

这是原型:

void *memset(void *s, int c, size_t n)
Run Code Online (Sandbox Code Playgroud)

首先我不确定我是否必须返回一些东西,因为当我使用memset时,例如

memset(str, 'a', 5);
Run Code Online (Sandbox Code Playgroud)

代替

str = memset(str, 'a', 5);
Run Code Online (Sandbox Code Playgroud)

这是我的代码所在:

void *my_memset(void *b, int c, int len)
{
    int i;

    i = 0;
    while(b && len > 0)
    {
        b = c;
        b++;
        len--;
    }
    return(b);
}

int main()
{
    char *str;

    str = strdup("hello");
    my_memset(str, 'a', 5);
    printf("%s\n", str);
}
Run Code Online (Sandbox Code Playgroud)

我不想在这个函数中使用数组,以更好地理解指针和内存,所以我没有得到2件事: - 如何将int c复制到我的void b指针上的一个字符 - 我要用什么条件来确定它在'\ 0'字符之前停止

编辑:我想知道有没有办法在没有投射的情况下执行此功能?

c memory pointers memset pointer-arithmetic

1
推荐指数
1
解决办法
1万
查看次数

C中for循环中的奇怪指针算法

我用IAR EBW编程msp430.

我的表达式如下:

adres = (uint_fast16_t *) 0x8602 + (0x0200*i);
Run Code Online (Sandbox Code Playgroud)

在for循环中,以便我随着每个循环增加.出于某种原因,它会跳过两个地址中的每一个并给我:

0x8602
0x8A02
0x8E02
Run Code Online (Sandbox Code Playgroud)

等等.因此跳过0x8802,也就是0x8C02等等.

为什么会这样?

////下面是完整代码,请注意我被放置在三个循环中,每个人都给出相同的结果.////还要注意在调试时检查时显示为:1,2,3 ......等

#include "io430.h"
#include <stdint.h>

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  // Inicjalizuj piny GPIO
  P3OUT &= ~(BIT4+BIT5);        // zeruj warto?ci by zapobiec krótkotrwa?ym impulsom
  P3DIR |= BIT4; // ustaw pin3.4 UCA0TXD oraz piny 3.0 CS, 3.1 SIMO, 3.3 CLK jako wyj?cie
  P3DIR &= ~(BIT5);               // ustaw pin3.5 UCA0RXD oraz …
Run Code Online (Sandbox Code Playgroud)

c pointers pointer-arithmetic msp430 iar

1
推荐指数
1
解决办法
195
查看次数

在C中更正指针算术

我试图在C中学习指针操作,我不知道代码的一部分是如何工作的.

#include <stdio.h>

int main() {
  int *alpha[17];

  *(alpha+4)= 35;
  *(alpha+5)= 35;
  *(alpha+12)= 50;

  printf("%d", *(alpha+4));
  *(alpha+8)=*(alpha+5) + *(alpha+12);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当前一行printf完美运行时,为什么线路不工作,导致崩溃?我试图让第9个值等于第6个和第13个值的总和.

c c++ pointers pointer-arithmetic

1
推荐指数
1
解决办法
224
查看次数

指针算法出错了

我正在尝试使用a char *来存储一个字符串,因为指针指向给char定字符串中第一个的内存位置,我尝试使用指针arithmetic(ptr++)来移动到下一个char(因为它们是按顺序存储的) .但是,在我的示例程序中,"string"大小是22,但是当我尝试运行for循环时,如下所示,它只运行12次.知道为什么吗?我是否错过了关于指针算法如何工作的重要内容?

#include <stdio.h>

int main(void) {
  char *strVar = "testfordifferentlength";
  int i,timesCalled=0;
  printf("\nLength = %d\n\n",strlen(strVar));
  for(i=0;i <= strlen(strVar);i++){
    printf("%c",*strVar);
    strVar++;
    timesCalled++;
  }
  printf("\n\nFor loop run %d times!\n",timesCalled);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c pointers pointer-arithmetic

1
推荐指数
1
解决办法
75
查看次数