我正在阅读Kernighan和Richie的C编程语言中有关数组和指针的章节。 他们给出了一个例子: /* strlen: return length of string s */ int strlen(char *s) { int n; for (n = 0; *s != ‘\0’; s++) n++; return n; } 然后说: “由于s是一个指针,递增它是完全合法的; s++对调用strlen的函数中的字符串没有影响,只是增加了strlen指针的私有副本。 这意味着像这样的电话 strlen(“hello, world”); /* string constant */ strlen(array); /* char array[100]; */ strlen(ptr); /* char *ptr; */ 所有的工作。“ 除了第一个调用示例之外,我觉得我理解所有这些:为什么或如何将字符串文字”hello, world”视为char *s ? 这怎么指针? 函数是否将此字符串文字指定为其局部变量*s的值,然后使用s作为数组名称/指针?
我已经搜索过但找不到任何结果(我的术语可能已关闭)所以请原谅我,如果之前已经提出过这个问题。 我想知道是否有一种简单的方法可以在没有首先声明函数指针然后为函数指针指定地址的情况下将void*作为C函数调用。 即。 假设要调用的函数是void(void) void *ptr; ptr = ; ((void*())ptr)(); /* call ptr as function here */ 用上面的代码,我得到错误C2066:在VC2008中强制转换为函数类型是非法的 如果可能,具有返回类型和多个参数的函数的语法有何不同?
可能重复: 尝试在C中打印值时出现分段错误 我对C很新,但不知道为什么这个程序会破坏。 如果我删除与i有关的行,程序将编译并运行,但是如果我分配i ,我将无法在没有程序中断的情况下为*ptr分配任何内容。 int main(void) { int i; int *ptr; i = 2; *ptr = 5; printf(“%d”,*ptr); }
我刚开始学习C并发现了一些关于字符串指针和字符串(char数组)的混淆。 任何人都可以帮我清醒一下吗? // source code char name[10] = “Apple”; char *name2 = “Orange”; printf(“the address of name: %p\n”, name); printf(“the address of the first letter of name: %p\n”, &(*name)); printf(“first letter of name using pointer way: %c\n”, *name); printf(“first letter of name using array way: %c\n”, name[0]); printf(“———————————————\n”); printf(“the address of name2: %p\n”, name2); printf(“the […]
我想的是: #include #include #include int main(void) { //test pointer to string char s[50]; char *ptr=s; printf(“\nEnter string (s): “); fgets(s, 50, stdin); printf(“S: %s\nPTR: %s\n”, s, *ptr); system(“PAUSE”); return 0; } 或者我应该使用带*(s + i)的for循环和格式说明符%c? 这是通过指针和简单的printf打印字符串的唯一可能方法吗? 更新:printf使用数组的第一个元素的地址进行操作,所以当我使用* ptr时,我实际上是使用第一个元素而不是它的地址。 谢谢。
我是C编程的新手,我遇到了一个问题。 如果复杂的声明,我发现了这一点 int *daytab[13]; // daytab is an array of 13 pointers to int 这意味着daytab是数组的名称,数组的名称指向数组的第一个元素。 数组名称与daytab++等指针操作不兼容(如果我错了,请纠正我)。 但我发现这段代码是用Dennis Ritchie编写的 main(int argc, char * argv[]) { while( –argc > 0 ) printf(“%s%s”,*++argv,(argc>1) > ” ” : “”); printf(“\n”); return 0; } 他们如何操纵argv ? 它不是数组名称吗?
我正在阅读The C Book ,试图在C语言中找到一个更好的基础。虽然我认为我通常会得到指针的概念,但有一点让我觉得它似乎正在推广它指向全局的任何东西。变量(例如,使用指针从void函数返回值的能力),我认为这自然带有所有伴随的危险。 除了指针引用数组中的特定变量或索引之外,指针和全局变量之间的区别是什么?
我试图从语法的角度理解C如何处理复杂的typedef的基础机制。 请考虑以下示例(问题末尾包含的参考资料)。 typedef int (*p1d)[10]; 是正确的声明,即p1d这里是一个指向10个整数数组的指针,就像在使用Array类型的声明下一样。 请注意,这与…不同 typedef int *p1d[10]; 这将使p1d成为类型为int的10个指针数组的名称。 所以,如果我考虑两个例子的运算符优先级(我将重写它们): int *p1d[10]; // Becomes … int* p1d[10]; 因此,从左到右阅读,并使用运算符优先级,我得到:“指向类型int的指针,名为p1d,大小为10”,这是错误的。 至于其他/第一种情况: int (*p1d)[10]; 我读作“p1d是一个int类型的指针,并且是一个包含10个这样的元素的数组”,这也是错误的。 有人可以解释用于确定这些typedef的规则吗? 我也想将它们应用于函数指针,我希望这个讨论也能解释const casts背后的逻辑(即:指向常量数据的指针和指向变量数据的const指针)。 谢谢。 参考文献: C教程:指向数组:指南http://www.taranets.net/cgi/ts/1.37/ts.ws.pl?w=329; b = 285 运营商优先顺序: http : //www.swansontec.com/sopc.html
我有以下几行代码: #define PORT 9987 和 char *ptr = (char *)&PORT; 这似乎适用于我的服务器代码。 但是当我在我的客户端代码中编写它时,它会给出以下错误消息: lvalue required as unary ‘&’ operand 我究竟做错了什么?
请考虑以下代码 #include #define ROW_SIZE 2 #define COL_SIZE 2 int main() { int a[ROW_SIZE][COL_SIZE]={{1,2},{3,4}}; // Base address:Pointer to the first element a 1D array printf(“Base address of array:%p\n”,a); //The value at the base address: should be the address of 1st 1D array printf(“Value at the Base address:%p\n”,*a); return 0; } 获得的产出: Sample Output: Base address of […]