-
a p=&a;q=&a;
关于这一步,没什么好说的。
此时 a 不应该等于 3 吗?
a 仍然等于 2,因为 printf("%d\t%d",*p++,q++) 不改变 a 的值,只改变 p 和 q 的指向位置,当这个 printf 执行时,p 和 q 的值不确定,可以打印出来看看!!
2.至于输出结果的差异,与编译器的执行顺序有关,可以在网上查看。 当然,你可以在程序末尾添加一个 printf 语句来查看 a 的值,你应该明白了!!
-
关键是要注意操作的优先级和组合的方向,*的优先级与高于++的优先级相同,单眼操作的组合方向是从右到左,并且需要注意++操作的特点,p++称为后自加, 也就是说先取 p 的值,然后做自加运算,所以在第一个 printing 语句中,打印 *p++ 应该输出 2,然后 p 做自加运算,这时 *p 的值是 3,所以在第二个语句中,*p 的值也是类似的情况。
-
我更改了程序,您可以运行它并查看原因。
int a=2,*p=&a,*q=&a;
printf( "%d", (int)p );
printf("%d", *p++)
printf( "***d", a );
printf( "%d", (int)p );
printf( "???d", *p );
printf( "%d", (int)q );
printf("%d",*(q++)
printf( "***d", a );
printf( "%d", (int)q );
printf( "???d", *q );
p=&a;q=&a;
printf( "%d", *p );
printf( "***d", a );
printf( "%d", (int)q );
printf("%d",(*q)++
printf( "***d", a );
printf( "%d", (int)q );
printf( "???d", *q );
-
#include ""
void main()
int a=2,*p=&a,*q=&a;
printf("%d\t%d",*p++,q++)p=&a;q=&a;p,q 再次指向 A 的地址。
printf("%d\t%d",*p,(*q)++ 所以打印 2 2
-
表示字符指针。
在计算机科学中,指针是编程语言中的一个对象,它使用地址指向计算机内存中其他位置的值。
由于可以通过地址找到所需的变量单元格,因此可以说地址指向变量单元格。 因此,地址的可视化称为“指针”。 这意味着可以通过它找到带有地址的存储单元。
人们普遍认为,C 语言的强大功能及其自由度很大程度上体现在它对指针的灵活使用上。 因此,毫不夸张地说,指针是C语言的灵魂。
同时,这种说法也让很多人误解了口碑,好像只有C指针才能算指针。 Basic 不支持指针,所以不要在这里这样做。 事实上,Pascal 语言本身也支持指针。
从最初的 Pascal 到现在的 Object Pascal,可以说指针的使用并不逊色于 C 语言的指针。
内存分配表。
计算机中的内存都已寻址,就像您家的地址一样。 当一个程序被编译或运行时,系统(可以是编译器或操作系统,不管是什么)会打开一个表。
每次遇到声明语句(包括函数传入参数的声明)时,都会打开一个内存空间,并向表中添加一行。
<>在这个程序中,我们首先提示用户输入正方形的尺寸,然后输入正方形的元素。 接下来,我们通过遍历正方形的每一行并使用指针指向每行相应列中的元素来找到正方形矩阵的对角线元素的总和。 最后,我们输出结果。 >>>More
派生类可以转换为基类,因为派生类本身有基类的成员,所以不需要强制转换,这就是为什么派生类的指针和引用可以转换为基类的指针和引用,而基类的指针和引用只能访问基类的成员, 即类型转换的向上强制。 >>>More
#include ""void prt(int *x,int *y,int *z) main() 另一个词 z; (和 ++ 处于相同的操作级别,并且从右到左组合); *(z++) 是先输出 40,然后加地址,不加元素,加上 *(z++) 这个格式是加地址; 因此,输出后,z 的地址发生了变化,而不是原来的变化,如果再次调用,您仍然将 c 的值传递给 40,并输出它,然后添加地址; a 和 b 的值发生变化; 你要记住第一句话,我把这句话括起来; *z++,就是拿元素加法,如果没有*号就是地址加法,如果你把z设置成一个数组,然后,给他两个元素,按照你上面的*(z++)他可以第二次输出第二个元素,记住,只在数组里加地址,链表, 也就是说,必须有一个字符串;如果不是单个,则可以使用添加的地址,并且必须在同一个字符串中;