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个字节,内存中一格为一个8位1字节,也就是说指针移动了四格。
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字节,也就指针移动了四格。