C语言之指针和数组

要理解指针,首先要从底层慢慢说,数据存储在内存的存储单元中,假如一个数字1存在了一个存储单元中,这个存储单元的地址是0xC8,好,现在知道了数据是1,地址是0xC8,总说地址是多少不方便吧,就说这是数据的房间吧,house,这个house指向了这个房间,也就是这个存储单元。总说1也不好,咱们再给它取个名称,就叫dear的吧,它还有个别名,就叫xiaodear,*就是一把钥匙,用它打开房间,哎,发现dear在那站着呢,但是我们找它说明和它还挺熟,就直接叫它xiaodear了,所以*house=xiaodear=dear,其中,house就是指针,xiaodear就是变量名,dear就是变量。这个变量dear=1,&是取地址符,就是问你的地址在哪,&dear=在某某房间=house=0xC8。指针怎么说呢,就像你找人一样,你从咨询公司那里拿到了那个人的家庭住址,下次再去他家直接去就行了,不用非得让咨询公司一起跟着。

看个简单的程序:

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int*)(&a + 1);
    printf("%d,%d\n", *(a + 1), *(ptr - 1));
    return 0;
}

&a是整个数组的地址值,+1,就是偏移量,&a+1依然是个地址,*就是钥匙,它开了&a+1这个地址的房间,找到了里面的那个数据,所以(int*)(&a+1)其实就是一个整形数据,但是这个数据已经超过这个数组的范围了,不知道是多少,*(a+1),a是数组第一个元素的地址,那么a+1就是第二个元素,*(a+1)就是2,*(ptr-1)相当于&a+1的数据前面的那个数据,也就是5,所以这个程序输出的结果就是2,5。

数组:

一维数组首先明白冒泡排序。概念就是同类型数据的一个集合就是数组。

#include <stdio.h>
int main(){
    int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
    int i, j, temp;
    //冒泡排序算法:进行 n-1 轮比较
    for(i=0; i<10-1; i++){
        //每一轮比较前 n-1-i 个,也就是说,已经排序好的最后 i 个不用比较
        for(j=0; j<10-1-i; j++){
            if(nums[j] > nums[j+1]){
                temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
    }
   
    //输出排序后的数组
    for(i=0; i<10; i++){
        printf("%d ", nums[i]);
    }
    printf("\n");
   
    return 0;
}

输出结果:1,2,3,4,5,6,7,8,9,10

猜你喜欢

转载自blog.csdn.net/u011397314/article/details/110873640