C语言编程精解-(6)-指针1

  • 函数malloc()与函数calloc()有什么区别?
  • 如何使用指针访问二维数组中的数据元素?

指针

1.程序 指针

// 如何使用指针
#include <stdio.h>
int main(int argc, const char * argv[]) {
    int v = 15;
    // 声明一个int类型指针
    int *pv;
    // 将V的内存地址保存到pv中
    pv = &v;

    printf("Value of v = %d",v);
    printf("\nValue of pv = %u",pv);
    printf("\nValue of *pv = %d",*pv);
}

输出:

Value of v = 15
Value of pv = 4022334908
Value of *pv = 15

2.重要的面试题

什么是间接引用?
答:当声明一个变量时,变量名是对变量值的直接引用,而声明一个指针时,是对其指向变量的间接引用,如果prt代表一个指针,那么可以使用*prt来访问指针prt指向的变量的值.

3.程序 指针运算

// 不使用指针对两个整数变量的值进行互换
// 不使用指针对两个整数变量的值进行互换
#include <stdio.h>
void swap(int x,int y);
int main(int argc, const char * argv[]){
    int a,b;
    a = 10;
    b = 5;
    printf("Before swapping => a = %d,b = %d",a,b);
    swap(a, b);
    printf("\nAfter swapping => a = %d,b = %d",a,b);
}
void swap(int x,int y) {
    int t;
    t = x;
    x = y;
    y = t;
}

输出:

Before swapping => a = 10,b = 5
After swapping => a = 10,b = 5

4.程序 指针运算

// 使用指针对两个整数变量的值进行互换
#include <stdio.h>
void swap(int *x,int *y);
int main(int argc, const char * argv[]){
    int a,b;
    a = 10;
    b = 5;
    printf("Before swapping => a = %d,b = %d",a,b);
    swap(&a, &b);
    printf("\nAfter swapping => a = %d,b = %d",a,b);
}
void swap(int *x,int *y) {
    int t;
    t = *x;
    *x = *y;
    *y = t;
}

输出:

Before swapping => a = 10,b = 5
After swapping => a = 5,b = 10

5.程序 数组与指针

// 使用指针计算数组大小及显示数组元素
#include <stdio.h>
int main(int argc, const char * argv[]){
    int x[50];
    int i = 0;
    char resp = 'y';
    int *p1,*p2;

    p1 = &x[0];
    while (resp=='y'||resp=='Y') {
        printf("\nEnter an element: ");
        scanf("%d",&x[i]);
        printf("\nEnter one more?(y/n:) ");
        fflush(stdin);
        resp = getchar();
        i++;
    }
    p2 = &x[i];
//    printf("\nNo of elements in arry = %ld",p2-p1);

    printf("\nDisplaying elements through pointers:\n");
    for (; p1<p2; )
        printf("%d\t",*p1++);
}

6.程序 使用指针查找数组中最小元素

// 使用指针查找数组中最小元素
#include <stdio.h>
int main(int argc, const char * argv[]){
    int i,n,small,*ptr,a[50];
    printf("How many elements? ");
    scanf("%d",&n);
    printf("Enter elements: \n");
    for (i = 0; i<n; i++)
        scanf("%d",&a[i]);
    ptr = a;
    small = *ptr;
    // 对ptr进行递增操作使其引用数组第二个元素
    ptr++;
    for (i = 1; i<n-1; i++) {
        if (*ptr<small)
            small = *ptr;
            ptr++;
    }
    printf("Smallest element = %d\n",small);
}

输出:

How many elements? 5
Enter elements: 
5 -10 25 -15 13
Smallest element = -15

7.程序 使用指针访问一维数组中的数据元素

// 使用指针访问一维数组中的数据元素
#include <stdio.h>
int main(int argc, const char * argv[]){
    int arr1[5] = {10,11,12,13,14};
    // 将数组起始地址保存到指针ptr1中
    int *ptr1 = arr1;
    int i;

    printf("Accessing elements through arrayname:\n");
    for (i = 0; i<5; i++)
        printf("%d\t",*(arr1+i));

    printf("\nAccessing elements through pointer: \n");
    for (i = 0; i<5; i++)
        printf("%d\t",*ptr1++);
}

输出:

Accessing elements through arrayname:
10    11    12    13    14    
Accessing elements through pointer: 
10    11    12    13    14

8.程序 使用指针访问二维数组中的数据元素

// 使用指针访问二维数组中的数据元素
#include <stdio.h>
int main(int argc, const char * argv[]){
    int arr2[][4] = {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };

    int *ptr2 = &arr2[0][0];
    int i,j;

    printf("\nAccessing elements using array name: \n");
    for (i = 0; i<3; i++) {
        for (j = 0; j<4; j++) {
            printf("%d\t",*(*(arr2+i)+j));
        }
        printf("\n");
    }
    printf("\nAccessing elements using pointer: \n");
    for (i = 0; i<3; i++) {
        for (j = 0; j<4; j++) {
            printf("%d\t",*ptr2++);
        }
        printf("\n");
    }
}

输出:

Accessing elements using array name: 
1    2    3    4    
5    6    7    8    
9    10    11    12    

Accessing elements using pointer: 
1    2    3    4    
5    6    7    8    
9    10    11    12

9.程序 静态内存和动态内存

// 静态内存和动态内存
#include <stdio.h>
int main(int argc, const char * argv[]){
    int num;
    int *ptr;

    printf("\nStatic memory allocation: ");
    printf("\nEnter a number: ");
    scanf("%d",&num);
    printf("You entered: %d",num);

    printf("\n\nDynamic memory allocation: ");
    printf("\nenter a number: ");

    // 动态分配内存,并使用指针ptr引用该内存块
    ptr = (int*)malloc(sizeof(int));
    // 存储数据到ptr所引用的内存块中
    scanf("%d",ptr);
    printf("You entered: %d",*ptr);
}

输出:

Static memory allocation: 
Enter a number: 100
You entered: 100

Dynamic memory allocation: 
enter a number: 200
You entered: 200

10.程序 为两个浮点数分配动态内存并求和

// 使用指针为两个浮点数分配动态内存并求和
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]){
    float *n1,*n2,*sum;
    // 动态分配内存
    n1 = (float*)malloc(sizeof(float));
    n2 = (float*)malloc(sizeof(float));
    sum = (float*)malloc(sizeof(float));

    printf("Enter two number: ");
    scanf("%f%f",n1,n2);
    *sum = *n1+*n2;
    printf("Sum of two numbers: %.2f",*sum);
}

输出:

Enter two number: 10.5 22.57
Sum of two numbers: 33.07

11.程序 指针数组

// 为一维整型数组分配动态内存
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]){
    int *arr[50];
    int i,n;
    printf("How many elements? ");
    scanf("%d",&n);

    printf("Enter elements: \n");
    for (i = 0; i<n; i++) {
        arr[i] = (int*)malloc(sizeof(int));
        scanf("%d",arr[i]);
    }
    printf("\nThe elements of array: \n");
    for (i = 0; i<n; i++)
        printf("%d\t",*arr[i]);
}

输出:

How many elements? 5
Enter elements: 
22 23 44 55 78

The elements of array: 
22    23    44    55    78    

12.重要的面试题

函数malloc()与函数calloc()有什么区别?
答:malloc()函数用于从堆上分配指定字节数的内存,而calloc()函数用于从堆上分配若干个指定字节数的内存块.


 上一篇
你会安然 你会无恙 你会安然 你会无恙
如果,一分钟的旅程,你让60秒充满奇迹和欢欣,那么,海阔天空都是你的,天地万物都是你的 你会安然 你会无恙@来源作者:Celia 如果你总清醒 当周围 众人均已迷糊,咒你骂你 如果你总自信能淡定 当所有人怀疑你 你尚能容他们的怀疑 如果
2019-03-19
下一篇 
C语言编程精解-(5)-字符与存储 C语言编程精解-(5)-字符与存储
字符串和字符类型数组的区别是什么? 寄存器变量是什么,它有什么优势? 局部变量与全局变量之间的区别是什么? 字符与字符串1.重要的面试题字符串和字符类型数组的区别是什么?答:在默认情况下,字符串内存是静态分配的,因此它由NULL初始化
2019-03-17
  目录