#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。可能是什么原因 ?
在我的代码中,我使用了这样的指针数组。
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 中检查指针是否是数组末尾的一个元素是完全合法的,如下所示:
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) 有人可以帮助我理解以下逻辑如何解决获得a和 的产品b吗?
int getProd(int a, int b){
return (uintptr_t)&((char (*) [a])0x0)[b];
}
Run Code Online (Sandbox Code Playgroud) 我不明白为什么 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) 我发现了我的错误(几个小时后),并在以下程序中将其隔离.问题在于使用指向结构的指针时计算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) 这是原型:
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'字符之前停止
编辑:我想知道有没有办法在没有投射的情况下执行此功能?
我用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中学习指针操作,我不知道代码的一部分是如何工作的.
#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个值的总和.
我正在尝试使用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)