C/C++ 指针问题

392 阅读1分钟

1.

int a = 1025;
int *p;
p = &a;
printf("size of integer is %d bytes\n",sizeof(int));
printf("Address = %d, value = %d\n",p,*p);
char *p0;
p0 = (char*)p;
printf("size of char is %d bytes\n",sizeof(char));
printf("Address = %d, value = %d\n",p0,*p0);

上述代码的结果为

捕获.JPG 问题:为什么p0和p指向相同的地址,取出的值却不一样? 解答:1025 的二进制表示为00000000 00000000 00000100 00000001。P0为char类型的指针,只占一个字节,所以取值时只能取低地址的一个字节,即00000001为1。

2.

#include <stdio.h>
int SumOfElements(int A[]) //此处被编译器解释为int *A
{
    int i, sum = 0;
    int size = sizeof(A) / sizeof(A[0]);
    printf("SOE - Size of A = %d, size of A[0] = %d\n",sizeof(A),sizeof(A[0]));
    for(i = 0;i < size;i++)
    {
        sum += A[i];
    }

    return sum;
}

int main()
{
    int A[] = {1,2,3,4,5};
    int total = SumOfElements(A);
    printf("Sum of elements = %d\n",total);
    printf("Main - Size of A = %d, size of A[0] = %d\n",sizeof(A),sizeof(A[0]));
}

上述代码的结果为

捕获.JPG
问题:为什么数组A在 main 函数和 SumOfElement 函数中的大小不同?
解答:A是函数SumOfElement的参数,到了这个函数中,A只是一个指针(地址,系统在本函数运行时,是不知道A所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址)所以,sizoef(A)的结果是指针变量A占内存的大小,一般在32位机上是4个字节。要想让函数获得数组的大小,有两种方法:

  1. 在函数代码中写上固定的数组大小
int SumOfElements(int A[]) 
{
    int i, sum = 0;
    int size = sizeof(A) / sizeof(A[0]);
    printf("SOE - Size of A = %d, size of A[0] = %d\n",sizeof(A),sizeof(A[0]));
    for(i = 0;i < 10;i++)
    {
        sum += A[i];
    }

    return sum;
}
  1. 把数组大小作为函数的第二个参数。