Maine

纵有疾风起,人生不言弃

8. C语言基础-指针和数组

基础略

案例 — 遍历数组:

int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = arr; // == int *p = &arr[0];

for (int i=0; i<10; i++)
{
    printf("arr[i]=%d, ", arr[i]);     // 传统数组打印方法
    printf("*(p+i)=%d, ", *(p+i));     // 通过指针运算得到
    printf("p[i]=%d, ", p[i]);         // 数组形式
    printf("\n");
}

案例 — 数组做形参

错误示例:

#include <stdio.h>

void print_arr(int *arr)
{
    int i = 0;
    int n = sizeof(arr)/sizeof(*arr);
    for (i = 0; i<n; i++)
    {
        printf("%d, ", *(arr+i));
    }
    printf("\n");
}

int main(int argc, const char * argv[]) {

    int arr[] = {1, 2, 45, 3, 456, -343, 344, -4, 2, 6767, 2, 3};
    print_arr(arr);

    return 0;
}

输出结果:

1, 2

原因分析:

  1. 形参中的数组不是数组,而是一个普通的指针变量
  2. 形参中的数组 int arr[], int arr, int arr[10000] 都一样 == int arr
  3. 64 位系统指针变量占8个字节大小,So sizeof(arr) = 8

解决办法(传递参数个数):

void print_arr(int *arr, int n)
{
    int i = 0;
    for (i = 0; i<n; i++)
    {
        printf("%d, ", *(arr+i));
    }
    printf("\n");
}

int main(int argc, const char * argv[]) {

    int arr[] = {1, 2, 45, 3, 456, -343, 344, -4, 2, 6767, 2, 3};
    // 提前获取数组长度
    int size = sizeof(arr)/sizeof(*arr);
    print_arr(arr, size);

    return 0;
}

案例三 — 字符数组和文字常量的区别

char str[] = "hello maine";
char *p = "hello maine";
*str = 'e';         // ok
*p = 'e';           // 段错误

/**
 * "hello maine" 是文字常量,不能修改
 * *p 保存了文字常量的地址,操作文字常量的值会导致段错误
 * str[] 是一个数组,编译器会将字符常量一个一个字符拷贝到数组的内存空间,
 * 两者不在一个位置
 */
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注