Tag: 指针

从输入C动态分配矩阵

我一直在尝试这段代码而且效果不佳。 void *matrix_allocate_variable (int size) { void *p1; if ((p1=(int*)malloc(size))==NULL){ printf(“out of memory.\n”); exit(1); } return p1; } 在这里,我创建了一个调用malloc并在出错时退出的函数,以便我可以在我的下一个函数中使用它: void matrix_new(int **matrices, int *row_counts, int *column_counts, char specifier) { int index, i; index= (int)(specifier-‘A’); scanf(“%d”,&row_counts[index]); scanf(“%d”,&column_counts[index]); matrices[index]= (int*)matrix__allocate_variable(sizeof(int)* (row_counts[index]*column_counts[index]); 这是我遇到问题的地方。 我正在尝试让用户输入一些用于创建矩阵的输入,但是我在尝试使其工作时遇到了很多问题。 有人可以帮我开始吗? PS。 有关更多详细信息,我在functions.c中创建函数,这是我到目前为止所拥有的。 我有一个main.c调用这些函数,以便稍后我可以添加,减去和转置,但到目前为止,我正在尝试输入数据,这是我遇到很多麻烦。 这是我的main.c ,我称之为函数。 /* Pointer to the set of matrix registers. […]

理解C中的dereference,address-of和array下标运算符

我将argv []定义为char *。 使用以下printf语句: printf(“%s\n”,argv[1]); // prints out the entire string printf(“%p\n”,&argv[1]); // & -> gets the address printf(“%c\n”,argv[1][0]);// prints out the first char of second var printf(“%c\n”,*argv[1]); // 这是我不明白的最后一个。 打印*argv[1]是什么意思? 为什么不和*argv[1][0] ,为什么你不能打印出printf(“%s\n”,*argv[1]); 。 另外,为什么&*argv[1]的地址不同?

为什么变量指针包含相同数据类型的地址?

指针声明的一般语法: data-type *pointer_name; 指针是一个变量,其值是另一个变量的地址,即存储器位置的直接地址。 与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量地址。 指针的数据类型必须与指针指向的变量相同。 为什么指针变量应该包含相同数据类型的变量的地址很重要? 由于指针与另一个变量的值无关,为什么整数指针不能具有float数据类型变量的地址? 正确forms: int a = 10; int * ptr =&a; 错误,类型不匹配 漂浮一个; int * ptr; ptr =&a;

将限制限定的指针参数分配给本地的限制限定变量

在阅读C标准,6.7.3.1“ restrict正式定义”后,我有以下误解。 我想知道以下代码是否会立即导致未定义的行为: void foo(int *restrict p) { int *restrict q = p; } 很明显, q被赋予基于另一个受限指针p 。 不清楚的是,这两个指针是否与同一个块(函数本身)相关联,或者与不同的块( p与函数本身, q与其复合语句体)相关联,因为,例如。 int *restrict p; { int *restrict q = p; } 不会导致未定义的行为(可以在子块中创建别名指针)。 MSVC ++中限制关键字和局部变量的最佳答案表明int *restrict q = p + 1; 会很好,但是[至少在C标准的情况下]并不是真的,因为表达式p + 1仍然基于p 。 该块的定义见6.7.3.1 p2: 如果[某个指针声明] D出现在一个块内并且没有存储类extern ,那么让B表示该块。 如果D出现在函数定义的参数声明列表中,则让B表示关联的块。 […] 那么函数的“关联块”与此上下文中的函数体是一样的吗? 因为我没有立即在文本前面找到对“相关块”一词的任何解释。

释放未初始化的指针会导致未定义的行为吗?

如果你有一个未初始化的指针,并且错误地尝试释放它,这是否会导致未定义的行为? 喜欢: int main(void){ char *string; free(string); return 0; }

使用指针交换结构

假设我们有如下结构: struct EMPLOYEE{ int EmpID; int Sal; } Stu[5]; 如果满足以下条件,我们希望交换这些结构: Stu[i].Sal < Stu[0].Sal 一种方法是通过交换整个结构。 像这样的东西: TempStu.Sal = Stu[i].Sal; Stu[i].Sal = Stu[0].Sal; Stu[0].Sal = TempStu.Sal; TempStu.EmpID = Stu[i].EmpID; Stu[i].EmpID = Stu[0].EmpID; Stu[0].EmpID = Temp.Stu.EmpID; 这使得它成为一种非常耗时的方法。 其他方法可能是使用指向EMPLOYEE结构的指针数组,然后只对这些指针进行排序。 我无法弄清楚如何做到这一点。 这是我做的一个开始.. EMPLOYEE *St[5]; for(int j=0; j<5; j++) { St[j] = &Stu[j]; } if(Stu[i].Sal < Stu[0].Sal) swap(St[i],St[0]); void swap(EMPLOYEE *A, […]

函数中* p和(* p)之间有什么区别?

我是编程和学习C中数组指针的新手。看看下面的程序。 第一个节目 #include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf(“%d”,*(*(num+1)+1)); *(*(num+1)+1)=0; printf(“%d”,*(*(num+1)+1)); return 0; } int fun(int **p) { *(*(p+1)+1)=2135; return 0; } 第二个节目 #include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf(“%d”,*(*(num+1)+1)); *(*(num+1)+1)=0; printf(“%d”,*(*(num+1)+1)); return 0; } int fun(int *p) { *((p+1)+1)=2135; return 0; } 第3节目 #include int fun(); int main() […]

char str 和char * str作为函数参数有什么区别?

假设我们有以下函数原型: void function1(char str[]); void function2(char *str); 现在说我们有一个字符串char name[] = “John”; 我们希望通过这些function。 两者有什么区别? 它们的用途和局限是什么? 是否存在一种优先于另一种情况的情况? 如果将字符串初始化为char *name = “John”它会有所作为吗? 我理解在函数中使用char str[]和char *str之间的区别,但我不知道它们作为函数参数或参数的行为。

为什么sqlite3_open我们使用双指针**而对于sqlite3_prepare我们使用指针*

请纠正我在哪里理解错误。 我读了这个答案https://stackoverflow.com/a/833124/5175709 ,我理解的是,由于对象可能会扩展并耗尽空间,因此内存位置也会改变。但是这里有两个sqlite3语法引用了对象不同。 为什么? sqlite3_open我们有: sqlite3 **ppDb SQLITE_API int SQLITE_STDCALL sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ 对于sqlite3_prepare,我们有: sqlite3 *db SQLITE_API int SQLITE_STDCALL sqlite3_prepare_v2( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of […]

关于C中的指针

我开始阅读一些关于C中指针的文章,我有一个我不明白的例子。 以下代码的输出应该是什么.. ?? main() { char far *s1 ,*s2; printf(“%d,%d”,sizeof(s1),sizeof(s2)); } OUTPUT-4,2 根据我的说法,sizeof()函数返回的值应该是4,因为far指针有4个字节的地址。 但解决方案手册中的答案是4,2。 谁能解释一下? 任何人都可以解释> ???