如何使用指针初始化2D数组.
int *mapTable[] = { {1,10} , {2,20} , {3,30} , {4,40} }; // It's giving error
Run Code Online (Sandbox Code Playgroud)
这int *mapTable是一个错误.
我怎样才能正确申报?
我正在学习C并且有一些问题.我正在试图为每个声明的变量打印内存插槽,但是当我为Char []声明指针时,它只是不起作用.
这是我的代码:
int main () {
char a[3]; // this variable is my problem
int b;
float c;
char d;
int e=4;
char *pachar; //A char type variable for the pointer.
int *paint;
float *pafloat;
char *pacharr;
int *paintt;
pachar = &a; // when I try to assign the memory to the pointer, it shows a Warning message.
paint = &b;
pafloat = &c;
pacharr = &d;
paintt = &e;
printf("%p \n",pachar);
printf("%p \n",paint);
printf("%p \n",pafloat);
printf("%p \n",pacharr);
printf("%p …Run Code Online (Sandbox Code Playgroud) 由于C语言中没有数组这样的东西,以下是否都存储在一个内存位置,或者每个元素的值存储在内存位置的"数组"中?
int array[] = {11, 13, 17, 19};
Run Code Online (Sandbox Code Playgroud)
场景1
{11, 13, 17, 19} --> location A
Run Code Online (Sandbox Code Playgroud)情景2
{
11 --> location A
13 --> location B
17 --> location C
19 --> location D
}
Run Code Online (Sandbox Code Playgroud)哪一个是有效的内存布局?
表达式x++;和x*2;被报告为非法。编译器产生错误。但是,如果x+1;没有报告错误。
谁能帮助我理解为什么特定的表达方式是非法的?或者,换句话说,为什么添加是合法的?
代码:
#include <stdio.h>
int main(void)
{
int x[]={1,2,3,4,5};
x++;
x+1;
x*2;
}
Run Code Online (Sandbox Code Playgroud) 使用指针时为什么不需要指定数组大小?
我是C的新手,并试图更好地了解它是如何工作的.
如果我使用指针来声明数组问候,我不需要指定数组大小.如果我拿走指针,那么我需要定义数组的大小.
为什么编译器在使用指针声明char变量时不需要知道要分配的数组的大小,但是当我只声明一个char变量时它就会这样做.有点混淆为什么会这样.
这是我的示例代码:
int main()
{
char *greet; // Works fine.
// char greet; // Doesn't work. Crashes when entering text.
// char greet[]; // Doesn't work. Array size missing, won't compile.
// char greet[20]; // Works fine.
printf("Enter name\n>");
gets(greet);
printf("Hello %s", greet);
}
Run Code Online (Sandbox Code Playgroud) Case I:
int a[12];
printf("%d",sizeof(a));
Case II:
int *a = (int *)malloc(12*sizeof(int));
printf("%d",sizeof(a));
Run Code Online (Sandbox Code Playgroud)
以上两个代码片段返回不同的输出,
48 在第一种情况下 4 在第二种情况下为什么会这样?
因为我在学习 CI 时经常看到指针。
我知道一个指针保存了内存中不同位置的十六进制值。所以指针就是例如:0x7fff5fbff85c
每个指针也是不同的类型。
int var = 10;
int *ptr = &var;
Run Code Online (Sandbox Code Playgroud)
这里的ptr指向var的位置。要获得 var 的值,我必须使用*ptr. 喜欢
printf("Var = %d", *ptr);
Run Code Online (Sandbox Code Playgroud)
将打印 `Var = 10;
但是,如果我对指针进行非内联声明,例如:
int var = 10;
int *ptr;
ptr = &var;
Run Code Online (Sandbox Code Playgroud)
*当我实际将内存地址分配给指针时,我不必在第三行中使用。但是当我得到一个带指针的函数时:
int var = 10;
void assignPointer(int *ptr) {
*ptr = 10;
}
Run Code Online (Sandbox Code Playgroud)
等一下!在我写这篇文章时,我意识到指针有两种不同的分配:
*ptr = 10;
Run Code Online (Sandbox Code Playgroud)
和
ptr = &var;
Run Code Online (Sandbox Code Playgroud)
有什么不同?在第一种情况下,我是否首先取消引用指针,将 10 分配给其持有的位置?在第二种情况下,我将实际位置分配给指针。
我有点困惑何时使用 * 何时不使用赋值。
如果我正在处理数组,为什么我需要指针呢?
int array[];
Run Code Online (Sandbox Code Playgroud)
这里的“array”已经保存了十六进制内存位置。这不使它成为一个指针吗?所以如果我想为数组分配一些东西,我不会写:
*array = [10, 2];
Run Code Online (Sandbox Code Playgroud)
首先我取消引用,然后我分配。
我迷路了 :(
编辑:也许有点不清楚。我不知道当你使用指针时什么时候必须使用 * 什么时候不用。携带十六进制的所有内容都是指针,对吗?数组的变量名携带它的十六进制内存位置。那么为什么它不是一个指针呢? …
当我尝试将自构造类型数组指定为NULL时,遇到了不兼容的类型错误.这是我的代码:
#include <stdio.h>
#incldue <stdlib.h>
typedef struct {
int i;
double j;
} MyStruct;
int main() {
MyStruct array[10];
... //doing something
*array = NULL;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下方法在Ubuntu上编译它:
gcc -o main main.c
Run Code Online (Sandbox Code Playgroud)
编译器显示以下错误:
error: incompatible types when assigning to type 'MyStruct {aka struct <anonymous>}' from type 'void *'
*array = NULL;
^
Run Code Online (Sandbox Code Playgroud)
如何将数组分配给NULL?
我知道数组和指针是不同的,在大多数情况下,数组名称将转换为指针.(正如这个问题所解释的那样:数组名称是指针吗?)但是当我的程序涉及自构造结构时,事情会有所不同.
我尝试了以下两件事:
// 1st
int main() {
int array[10];
... //doing something
*array = NULL; // this gives a warning!!!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在编译时只有一个警告,而下面的代码有错误. …
我的任务是在用户输入月份和年份时创建日历.所有这些都很有效,但我无法弄清楚如何更新char monthName[256];变量.我的猜测是monthName = "January"(或无论哪个月),但这不起作用.不知道我做错了什么.
FWIW,用户不输入月份名称.我必须根据用户输入的月份数将其打印到屏幕上.
这是我运行的程序:
#include <stdio.h>
int main(void)
{
int y = 1234;
char *p = &y;
int *j = &y;
printf("%d %d\n", *p, *j);
}
Run Code Online (Sandbox Code Playgroud)
我对输出有点困惑.我所看到的是:
-46 1234
Run Code Online (Sandbox Code Playgroud)
我把这个程序写成了一个实验,不知道它会输出什么.我期待可能有一个字节y.
这里发生了什么"幕后"?解除引用如何p给我-46?
正如其他人指出的那样,我必须进行明确的施法才能导致UB.我没有改变这一行char *p = &y;,char *p = (char *)&y;所以我没有使下面的答案无效.
此程序不会导致此处指出的任何UB行为.
使用有什么区别
float* f;
Run Code Online (Sandbox Code Playgroud)
和
float f[4];
Run Code Online (Sandbox Code Playgroud)
或者他们的处理方式完全相同?使用一个而不是另一个可能会导致您遇到内存分配问题吗?如果没有,是否有任何情况下他们被区别对待?
不知道这是否相关,但我使用类型 float* 作为函数参数。例如:
void myfun(float* f){
f[0] = 0;
f[1] = 1;
f[2] = 2;
f[3] = 3;
}
Run Code Online (Sandbox Code Playgroud)
它编译并运行良好(我不确定为什么 - 我认为因为我没有分配任何内存f,它会抛出某种异常)。
我需要帮助试图弄清楚为什么我的指针数组不起作用.我正在递增指针地址和I.我的控制台窗口只是挂起.
int *arr = new int[10];
int i = 0;
while (i < 10){
*arr = i; // assign the value of arr to i
arr++; // increment the pointer by 1
i++; // increment i
}
delete[] arr;
Run Code Online (Sandbox Code Playgroud) 通常要找到阵列的大小,我们做..
int A[]={1,2,67,9,0,-1,-90};
int n=sizeof(A)/sizeof(A[0]);
printf("the size of the array is %d\n", n);`
Run Code Online (Sandbox Code Playgroud)
上面代码的输出显示大小为7.但当A被放入某个指针然后,如果我们尝试做同样的,它显示
int A[]={1,2,67,9,0,-1,-90};
int *B=A;
int n=sizeof(B)/sizeof(B[0]);
printf("the size of the array is %d\n", n);
Run Code Online (Sandbox Code Playgroud)
答案是2
如何使用此指针找到数组的大小.