c语言 指针星号,C中的指针:何时使用&符号和星号?

15a9d8029039011be18c96112d23a94e.png

拉莫斯之舞

处理数组和函数时有一种模式; 起初有点难以看到。在处理数组时,记住以下内容是有用的:当数组表达式出现在大多数上下文中时,表达式的类型被隐式地从“N元素数组T”转换为“指向T”,并且其值被设置指向数组中的第一个元素。此规则的例外情况是,数组表达式显示为&或sizeof运算符的操作数,或者它是在声明中用作初始值设定项的字符串文字。因此,当您使用数组表达式作为参数调用函数时,该函数将接收指针,而不是数组:int arr[10];...foo(arr);...void foo(int *arr) { ... }这就是为什么你不使用&运算符作为对应于“%s”的参数scanf():char str[STRING_LENGTH];...scanf("%s", str);由于隐式转换,scanf()接收char *指向str数组开头的值。这适用于使用数组表达式作为参数调用的任何函数(几乎任何str*函数*scanf和*printf函数等)。在实践中,您可能永远不会使用&运算符调用带有数组表达式的函数,如:int arr[N];...foo(&arr);void foo(int (*p)[N]) {...}这样的代码并不常见; 您必须知道函数声明中数组的大小,并且该函数仅适用于指向特定大小的数组的指针(指向T的10元素数组的指针与指向11元素数组的指针的类型不同T)。当数组表达式作为操作&符的操作数出现时,结果表达式的类型是“指向T的N元素数组的指针”,或者T (*)[N],它与指针数组(T *[N])和指向基类型的指针不同(T *)。在处理函数和指针时,要记住的规则是:如果要更改参数的值并将其反映在调用代码中,则必须将指针传递给要修改的事物。同样,数组会投入一些动作,但我们会首先处理正常情况。请记住,C 按值传递所有函数参数; 形式参数接收实际参数中值的副本,并且形式参数的任何更改都不会反映在实际参数中。常见的例子是交换功能:void swap(int x, int y) { int tmp = x; x = y; y = tmp; }...int a = 1, b = 2;printf("before swap: a = %d, b = %d\n", a, b);swap(a, b);printf("after swap: a = %d, b = %d\n", a, b);您将获得以下输出:在交换之前:a = 1,b = 2交换后:a = 1,b = 2形式参数x和y从不同的对象a和b,所以要改变x和y未在反射a和b。因为我们要修改的值a和b,我们必须通过指针,以他们的交换功能:void swap(int *x, int *y) {int tmp = *x; *x = *y; *y = tmp; }...int a = 1, b = 2;printf("before swap: a = %d, b = %d\n", a, b);swap(&a, &b);printf("after swap: a = %d, b = %d\n", a, b);现在您的输出将是在交换之前:a = 1,b = 2交换后:a = 2,b = 1请注意,在交换函数中,我们不会更改xand y的值,而是更改what x和y 指向的值。写作*x不同于写作x; 我们没有更新价值x本身,我们从该位置获取位置x并更新该位置的值。如果我们想要修改指针值,这同样适用; 如果我们写int myFopen(FILE *stream) {stream = fopen("myfile.dat", "r"); }...FILE *in;myFopen(in);然后我们修改输入参数的值stream,而不是stream 指向stream的值,因此更改对值的影响没有影响in; 为了使其工作,我们必须传入一个指针指针:int myFopen(FILE **stream) {*stream = fopen("myFile.dat", "r"); }...FILE *in;myFopen(&in);再次,阵列投入了一些猴子扳手。将数组表达式传递给函数时,函数接收的是指针。由于如何定义数组下标,您可以在指针上使用下标运算符,就像在数组上使用它一样:int arr[N];init(arr, N);...void init(int *arr, int N) {size_t i; for (i = 0; i 

  ...

  *foo = ...;}不行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值