C语言指针赋值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针赋值?相关的知识,希望对你有一定的参考价值。
求帮忙解释一下这个为啥错了,a+1是个地址,指针取地址不行吗?
参考技术A 类型不匹配,这个时候a相当于指针的指针,这样写当然不正确了,你要是想取这个地址,可以写成p = *(a+1); 参考技术B 你可以写成 *p = (char*)a+1;
强制把a变成 char* ,实际上就是把a变成1维的"ABC"\0"BCD",然后取第2个字母,就是B开始的字符串。*p实际上就是"BC"\0 (数组第1个"ABC"中的"BC")
我觉得这可能不是你想要的结果。
或者是 char*p = (char*) (a+1); a+1,就是指向数据a的第2个数据,即 “BCD”,然后强制转换类型为char*p,再赋值给p
这个可能是你想要的。 参考技术C 指针还有基类型
a的指针基类型是char (*)[5],显然和指针p的char *是不同的,
如,此处的a+1和(char *)a+1值是不同的本回答被提问者采纳
C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )
前言
如果要 通过 函数形参 间接赋值 修改 n n n 级指针, 需要向函数中传入 n + 1 n + 1 n+1 级指针 形参 ;
一、在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 )
通过 函数 形参变量 , 间接赋值 返回 生成的 二级指针 函数 ;
如果要生成一个 二级指针 , 必须传入 三级指针 , 才能修改 该 二级指针 ;
注意 : 传入的 三级指针 , 不要直接修改该值 , 先创建一个临时的 局部二级指针变量 , 将 二级指针 生成完毕后 , 最后再给 三级指针 指向的地址 进行赋值 ;
代码示例 :
/**
* @brief 生成二维指针
* @param num
* @return
*/
int generate_memory(char ***p3, int num)
// 循环控制变量
int i = 0;
// 声明二维指针
char **p = NULL;
// 在堆内存中 , 分配一块内存空间
// 用于存储 num 个 一维指针
// 每个 一维指针 指向一块内存空间
p = (char **)malloc( sizeof(char*) * num );
if(p == NULL)
return -1;
// 遍历 二维指针 指向的多个 一维指针
// 并为每个 一维指针 在堆内存中 分配 20 字节内存
for(i = 0; i < num; i++)
// 为每个字符分配 20 字节空间
p[i] = (char *)malloc(sizeof (char) * 20);
// 向内存中写入 字符串 , 字符串内容是 i + 1
// 注意是通过通配符拼装的字符串
sprintf(p[i], "%d", i + 1);
// 将 三维指针 指向 生成的 二维指针 地址
*p3 = p;
return 0;
二、完整代码示例
完整代码示例 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* @brief 生成二维指针
* @param num
* @return
*/
int generate_memory(char ***p3, int num)
// 循环控制变量
int i = 0;
// 声明二维指针
char **p = NULL;
// 在堆内存中 , 分配一块内存空间
// 用于存储 num 个 一维指针
// 每个 一维指针 指向一块内存空间
p = (char **)malloc( sizeof(char*) * num );
if(p == NULL)
return -1;
// 遍历 二维指针 指向的多个 一维指针
// 并为每个 一维指针 在堆内存中 分配 20 字节内存
for(i = 0; i < num; i++)
// 为每个字符分配 20 字节空间
p[i] = (char *)malloc(sizeof (char) * 20);
// 向内存中写入 字符串 , 字符串内容是 i + 1
// 注意是通过通配符拼装的字符串
sprintf(p[i], "%d", i + 1);
// 将 三维指针 指向 生成的 二维指针 地址
*p3 = p;
return 0;
/**
* @brief 打印二维指针数据
* @param array
* @param num
*/
void printf_array(char **array, int num)
// 循环控制变量
int i = 0;
// 判定指针合法性
if(array == NULL)
return;
// 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
for(i = 0; i < num; i++)
printf("%s\\n", array[i]);
/**
* @brief 二维指针排序
* @param p
* @param num
* @return
*/
int sort_array(char **p, int num)
// 循环控制变量
int i = 0, j = 0;
// 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量
char *tmp = NULL;
// 判定指针合法性
if(p == NULL)
return -1;
// 对 二维指针 指向的数据进行排序
for(i = 0; i < num; i++)
for(j = i + 1; j < num; j++)
// 交换 i , j 指针指向的内存数据
// 从 大 到 小 进行排序
if(strcmp(p[i], p[j]) < 0)
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
return 0;
/**
* @brief 释放二维指针内存
* @param p
* @param num
*/
void free_mem(char ***p3, int num)
// 循环控制变量
int i = 0;
// 设置临时变量 , 接收 p3 指向的二维指针
char **p = *p3;
// 判定指针合法性
if(p3 == NULL)
return;
// 释放内存
// 先释放 num 个 一级指针
for(i = 0; i < num; i++)
if(p[i] != NULL)
free(p[i]);
p[i] = NULL;
// 再释放 二级指针
if(p != NULL)
free(p);
// 二维指针 置空
*p3 = NULL;
/**
* @brief 主函数入口
* @return
*/
int main()
// 二维指针 指向的 一维指针 个数
int num = 4;
// 声明二维指针
char **p = NULL;
// 循环控制变量
int i = 0, j = 0;
// 排序时 , 交换指针 , 该指针是存储 要 交换指针 的临时变量
char *tmp = NULL;
// 在堆内存中 , 分配一块内存空间
// 用于存储 num 个 一维指针
// 每个 一维指针 指向一块内存空间
generate_memory(&p, num);
// 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
printf_array(p, num);
// 对 二维指针 指向的数据进行排序
sort_array(p, num);
// 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串
printf("\\nSort : \\n");
printf_array(p, num);
// 释放内存
free_mem(&p, num);
// 命令行不要退出
system("pause");
return 0;
执行结果 :
以上是关于C语言指针赋值?的主要内容,如果未能解决你的问题,请参考以下文章