二级指针的使用情况
2014-02-24 21:51
239 查看
一、用二级指针作为函数参数,有两种典型情况:
1.需要传递一级指针的数组时:
例如标准 C 的 main 函数:
int main(int argc, char*[] argv),数组最高维可以退化,char*[] argv 等价于 char** argv。这里
argv 代表命令行参数数组。
2.需要对传入的一级指针进行修改时:
例如:
void alloc_new_char_array(int n, char** t)
{
*t = (char*)malloc(n * sizeof(t));
}
这里可以通过返回值达到相同的效果,不过需要同时修改多个指针的时候就不能用返回值
了。另外,C++中可以用引用代替,本质上和这里的修改指针的方法相同。
----
类似地,一级指针作为参数则用来传递非指针数组,以及对非指针对象进行修改。
******************************************************************************
******************************************************************************
补充二、指针用作传出参数时,需要二级指针
注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。
你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数
栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间;要指向堆上或此函数外的
内存空间
实例2
1.需要传递一级指针的数组时:
例如标准 C 的 main 函数:
int main(int argc, char*[] argv),数组最高维可以退化,char*[] argv 等价于 char** argv。这里
argv 代表命令行参数数组。
2.需要对传入的一级指针进行修改时:
例如:
void alloc_new_char_array(int n, char** t)
{
*t = (char*)malloc(n * sizeof(t));
}
这里可以通过返回值达到相同的效果,不过需要同时修改多个指针的时候就不能用返回值
了。另外,C++中可以用引用代替,本质上和这里的修改指针的方法相同。
----
类似地,一级指针作为参数则用来传递非指针数组,以及对非指针对象进行修改。
******************************************************************************
******************************************************************************
补充二、指针用作传出参数时,需要二级指针
注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。
你定义了一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数
栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间;要指向堆上或此函数外的
内存空间
实例1
#include <stdio.h> #include <string.h> char *ab(void); void ak(char **ret); void ac(char *ret); int main() { char havec[] = "this is a b c d"; char **ret; // Alloc memory for secondary pointer char *tmp; // Alloc memory for first pointer ret = &tmp; // this is imporint, why? ak(ret); printf("%s\n",tmp); // Ok tmp = ab(); printf("%s\n",tmp); // Ok ac(havec); printf("havec = %s\n",havec); return 0; } void ak(char **ret) // output argument, memory is alloced in the function { static char aa[] = "this is output argument"; *ret = aa; } void ac(char *ret) // memory is alloced outside the function { char *tmp; if((tmp = index(ret,'c')) ==NULL) // this is just a example return ; *tmp = '\0'; } char *ab(void) // return a pointer, memory is alloced in global { return "this is return value"; }
实例2
#include <stdio.h> int main() { char *ret; ak(ret); return 0; } int ak(char *ret) { static char aa[] = "abc";ret = aa; // This ret is only a copy of the original ret }
相关文章推荐
- c总结9--- 二级指针使用三种模型之二(二级指针2)
- const 和二级指针的使用
- 二级指针的使用
- 关于软件基础中为什么使用二级指针的分析
- 链表:二级指针的使用
- 二级指针的使用错误解决一例
- 二级指针使用注意点
- 二级指针使用举例
- 二级指针使用
- 二级指针的使用
- 一级指针与二级指针的使用,以及使用二级指针的场合
- C语言指针数组使用案例【二级指针之指针数组】
- 什么情况下指针需要使用malloc分配内存,什么时候不需要
- 链表:二级指针的使用
- Android中ViewPager + Fragment使用ButterKnife注解时出现空指针NullPoint的情况
- 二级指针的使用
- 有关STL中map的key是指针的情况分析和其他map使用注意点
- 段错误的第5种情况——使用空指针
- 二级指针的使用实例
- 关于二级指针的使用测试小例子,仅供测试--参数传递的时候用指针最好,因为压栈的时候指针,只是压入一个地址的值,最多4个字节(32位机上),提供的3个测试例子,基于VC6.0的环境。