筑基_C_3_两个同类型变量的数据交换

3.1 泛型函数swap()

#define C99_OR_UP

void swap(void *vp1, void *vp2, uint8_t size)
{
#ifdef C99_OR_UP
    uint8_t buffer[size];
    memcpy(buffer, vp1, size);
    memcpy(vp1, vp2, size);
    memcpy(vp2, buffer, size);
#else
    void *buffer;
    buffer = malloc(size * sizeof(char));
    memcpy(buffer, vp1, size);
    memcpy(vp1, vp2, size);
    memcpy(vp2, buffer, size);
    free(buffer);
#endif
}

3.2 测试

3.2.1 对整型测试

int main(int argc, char *argv[])
{
	int i1 = 5;
    int i2 = 6;
    
    printf(">>> Test: int data type...\r\n");
    printf("i1 = %d, i2 = %d, \r\n", i1, i2);
    swap(&i, &j, sizeof(int));
    printf("After swap: i1 = %d, i2 = %d, \r\n", i1, i2);
    
	return 0;
}

3.2.2 对字串(指针定义)测试

int main(int argc, char *argv[])
{
	char *pStr1 = "abcdefg";
    char *pStr2 = "1233456";
    
    printf(">>> Test: string defined by char pointer...\r\n");
    printf("pStr1 = %s, pStr2 = %s, \r\n", pStr1, pStr2);
    swap(&pStr1, &pStr2, sizeof(pStr1));
    printf("After swap: pStr1 = %s, pStr2 = %s, \r\n", pStr1, pStr2);
    
	return 0;
}

3.2.3 对字串(数组定义)测试

int main(int argc, char *argv[])
{
	char str1[] = "xxxxxxx";
    char str2[] = "8888888";
    
    printf(">>> Test: string defined by char array...\r\n");
    printf("str1 = %s, str2 = %s, \r\n", str1, str2);
    swap(str1, str2, sizeof(str1));	// attention: str1 == &str1
    printf("After swap: str1 = %s, str2 = %s, \r\n", str1, str2);
      
	return 0;
}

3.2.4 对指针数组数据测试

void print_nodes(void *nodes, uint8_t len, uint8_t elemSize)
{
    uint8_t i;
    void *strAddr; 
    for(i = 0; i < len; i++) {
        strAddr= (char *)nodes + i * elemSize; // pointer arithmetic
        printf("|%s", *(char **)strAddr); // dereference 1-level
    }
    printf("|\r\n");
}

int main(int argc, char *argv[])
{
	char *nodes1[] = {"Ab", "F#", "B", "Gb", "D"};
    char *nodes2[] = {"Eb", "Eb", "Eb", "Eb", "Eb"};
    
    printf(">>> Test: pointer array...\r\n");
    printf("nodes1: ");
    print_nodes(nodes1, sizeof(nodes1)/sizeof(char *), sizeof(char *)); 
    printf("nodes2: ");
    print_nodes(nodes2, sizeof(nodes2)/sizeof(char *), sizeof(char *));

    swap(nodes1, nodes2, sizeof(nodes2)); // attention: nodes1 == &nodes1

    printf("nodes1: ");
    print_nodes(nodes1, sizeof(nodes1)/sizeof(char *), sizeof(char *));
    printf("nodes2: ");
    print_nodes(nodes2, sizeof(nodes2)/sizeof(char *), sizeof(char *));
      
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值