C/C++ 指针基础以及互调实践

point.h

void getPoint(int a);

void showPoint();

void forArray();

point.c

#include <stdio.h>
#include <ctype.h>
#include "CppUtils.h"
//c中获取数组长度的方法
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
//c中结构体
struct User {
    char id[5];
    char name[10];
    int age;
    char sex[3];
};
//*取值 &取地址 
void getPoint(int a) {
    int *pa = &a;
    printf("pa===1===%d,%d\n", pa, *pa);
    *pa = 6;
    printf("pa===2===%d,%d\n", pa, *pa);
}

//访问数组的两种方法:
//下标法:num[0];
//指针法:*(pnum+idx)
void forArray() {
    char str1[50] = {0}, str2[] = "I Love cctry.com!";
    //这种最简单
    size_t size = ARRAY_SIZE(str2);
    for (int i = 0; i < size; ++i) {
        str1[i] = str2[i];
    }
    printf("forArray=%s\n", str1);
    printf("forArray=%d\n", sizeof(str1));
    printf("forArray=%d\n", getStringLenght(str1));

    char *newChar = str2;
    for (int i = 0; i < size; ++i) {
        *(newChar + i) = str2[i];
    }
    printf("newChar=%s\n", newChar);
    printf("newChar=%d\n", sizeof(newChar));
    printf("newChar=%d\n", getStringLenght(newChar));
}

void showPoint() {
    int num[] = {18, 20};
    printf("num[0]==%d\n", num[0]);
    printf("num[1]==%d\n", num[1]);
    int *pnum = &num[0];
    printf("num[0]==%d\n", &pnum[0]);
    printf("num[1]==%d\n", &pnum[1]);

    //地址值相差4也就是4个字节,内存中一格为一个81字节,也就是说指针移动了四格。
    int *pnum_0 = &num[0];
    int *pnum_1 = &num[1];
    if (++pnum_0 == pnum_1) {
        printf("数组内存是连续了,pnum_1 = %d\n", pnum_1);
    }

    char chars[] = {'a', 'b'};
    int *pchars = chars;
    printf("pchars[0]==%d\n", &pchars[0]);
    printf("pchars[1]==%d\n", &pchars[1]);

    double doubles[] = {1.0, 2.0};
    int *pdoubles = doubles;
    printf("doubles[0]==%d\n", &pdoubles[0]);
    printf("doubles[1]==%d\n", &pdoubles[1]);

    long longs[] = {1.0, 2.0};
    int *plongs = longs;
    printf("plongs[0]==%d\n", &plongs[0]);
    printf("plongs[1]==%d\n", &plongs[1]);


    struct User s1 = {"0001", "Tom", 10, "男"};
    struct User s2 = {"1102", "maqi", "18", "男"};

    struct User users[] = {s1, s2};
    int *pusers = users;
    printf("pusers[0]==%d\n", &pusers[0]);
    printf("pusers[1]==%d\n", &pusers[1]);
}

CppUtil.c

#include <cstring>
#include "CppUtils.h"

int getStringLenght(char *string) {
    return strlen(string);
}

CppUtil.h

#ifdef __cplusplus
extern "C" { // 告诉编译器下列代码要以C链接约定的模式进行链接
#endif
int getStringLenght(char *string);
#ifdef __cplusplus
}
#endif

main.cpp

extern "C" {
#include "point.h"
}
int main() {
    getPoint(10);
    showPoint();
    forArray();
} 

最终结果后为

a====12
b====10
pa===1===2686592,10
pa===2===2686592,6
num[0]==18
num[1]==20
num[0]==2686540
num[1]==2686544
数组内存是连续了,pnum_1 = 2686544
pchars[0]==2686538
pchars[1]==2686542
doubles[0]==2686520
doubles[1]==2686524
plongs[0]==2686512
plongs[1]==2686516
pusers[0]==2686416
pusers[1]==2686420
forArray=I Love cctry.com!
forArray=50
forArray=17
newChar=I Love cctry.com!
newChar=4
newChar=17

总结:
1.注意这是一个从main.cpp->point.c->CppUtil.cpp的调用过程,从中你可以学到如何C/C++之间的混合调用。
2.getStringLenght方法为point.c调用CppUtil.cpp的方法,因为C中缺少strlen()的方法,为了避免互调时经常出现的方法未定义问题请注意一下几点:
2.1. 因为是point.c调用CppUtil.cpp 所以CppUtil.h需要申明使用C编译器编译getStringLenght方法,即使用#ifdef __cplusplus。
2.2.因为是main.cpp调用point.c 所以main.cpp中应该在引入point.h时申明使用C编辑器编译该头文件即extern “C” {}。
3 *(newChar + i) = str2[i];该方法是给指针偏移并赋值达到copy的效果
4. showPoint方法中 地址值相差恒定为4也就是4个字节,内存中一格为一个8位1字节,也就指针移动了四格。

猜你喜欢

转载自blog.csdn.net/qq_20330595/article/details/82116558