C语言中指针和数组的总结

本文详细探讨了C语言中的指针和数组,包括它们的定义、使用方式及相互之间的关系。通过实例解析了指针如何作为数组的别名,以及如何通过指针操作数组元素。此外,还阐述了指针在数组遍历和内存管理中的关键作用,帮助读者深入理解C语言的基础概念。
摘要由CSDN通过智能技术生成

Index:
    (new) 指针和数组的区别
    (一) 指针的类型, 指针指向的类型.
    (二) 指针的加减运算.
    (三) 指针与数组.
    (四) 数组做函数的形参.
    (五) 函数指针.
    (六) 指针与数组/数组做函数形参.
    (七) C-Style的字符串.
    (八) 复杂指针的定义.
    (九)C语言中没有引用!
   

(new) 指针和数组的区别: http://coolshell.cn/articles/11377.html
指针和数组的区别不仅仅是"指针p定义后可以改变其值, 而数组a[]一旦定义后无法改变a的值";
先看下面的代码, 在哪一行会coredown ?
#include <stdio.h>
struct str{
    int len;
    char s[0];
};

struct foo {
    struct str *a;
};

int main(int argc, char** argv) {
    struct foo f={0};
    if (f.a->s) {
        printf("%x\n", f.a->s);
        printf( f.a->s);
    }
    return 0;
}



答案是在printf( f.a->s) 挂掉, printf("%x\n", f.a->s)会打印出4,
如果代码中的struct str结构体中的char s[0];改成char *s, 那么代码在if(f.a->s)处就挂掉了, why ?

if (f.a->s)   // char* s;
if (f.a->s)   // char s[0];
以上两种有什么不同?
用GDB查看汇编代码后发现,:
a. 对于char s[0]来说,汇编代码用了lea指令,lea   0×04(%rax),   %rdx
b. 对于char*s来说,汇编代码用了mov指令,mov 0×04(%rax),   %rdx
lea全称load effective address,是把地址放进去,而mov则是把地址里的内容放进去。所以,就crash了。
从这里,我们可以看到,访问成员数组名其实得到的是数组的相对地址,而访问成员指针其实是相对地址里的内容(这和访问其它非指针或数组的变量是一样的)

# 对于数组 char s[10]来说,数组名 s 和 &s 都是一样的.
char a[10] = {0};
char (p)[10] = &a;
printf("%x %x\n", a, p);  // 你会发现两个值是一样的



代码二, 哪一行会挂掉?
struct test{
    int i;
    short c;
    char *p;
    char s[10];
};
int main(){
    struct test *pt=NULL;
    printf("&s = %x\n", pt->s); //等价于 printf("%x\n", &(pt->s) );
    printf("&i = %x\n", &pt->i); //因为操作符优先级,我没有写成&(pt->i)
    printf("&c = %x\n", &am
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值