char * 和 void *】的更多相关文章

POSIX.1 将 read函数的原型做了修改,经典的定义为 int read(int filedes, char *buf, unsigned nbytes); 修改为 ssize_t read(int filedes, void *buf, size_t nbytes); 主要从以下几个方面考虑 First, the second argument was changed from a char * to a void * to be consistent with ISO C: the t…
1.http://blog.csdn.net/szchtx/article/details/10396149 char ss[]="C++";  ss[0]='c';                  // 合法 char *p="C++";  p[0]='c';                   // 合法但不正确 该段代码在VS2010下编译可以通过,但是运行时程序会停止工作,为什么呢?原因在于p[0]='c'这一语句.该语句试图修改p指向的字符串的首个字符,…
//转换float数据到字节数组 unsigned char i; float floatVariable; unsigned ]; (unsigned char) *pdata = ((unsigned char)*)&floatVariable; //把float类型的指针强制转换为unsigned char型 ;i<;i++) { charArray[i] = *pdata++;//把相应地址中的数据保存到unsigned char数组中 } //转换字节数组到float数据 floa…
1.char *s1 = "ssss"; 2.char s2[] = "bbbb"; 对于第一种,我是无法理解,无法想象字符串赋值给一个char类型的指针,查了一番貌似这样,不是把字符串的指针给s1,而是字符串第一个字符的地址,对于c标准库的string.h的函数strcpy(char *dest,const char* src),好像也能把第二个参数以""这样的字符代替,估计取得也是第一个字符的首地址,"ssss"存储在程序…
例如: #define NULL ((void *)0) 用来定义无效的指针 (void *)0 就是将0强制转化为(void *)类型的指针 char *ch = (void *)0;//ch指向地址0 一般把(void*)0定义为NULL表示这是个空指针 void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据. 众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值:如果p1和p2指向不同的数据类型,则必须使…
http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c When a pointer to a particular type (say int, char, float, ..) is incremented, its value is increased by the size of that data type. If a void pointer which points to…
在C语言中,自动变量在堆栈中分配内存.当包含自动变量的函数或代码块退出时,它们所占用的内存便被回收,它们的内容肯定会被下一个所调用的函数覆盖.这一切取决于堆栈中先前的自动变量位于何处,活动函数声明了什么变量,写入了什么内容等.原先自动变量地址的内容可能被立即覆盖,也可能稍后才被覆盖. 解决方案: 1. 返回一个指向字符串常量的指针.例如: char* func() { return "Only works for simple strings"; } 这是最简单的解决方案,但如果你需要…
char str[] = "abcd";定义了一个局部字符数组,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以返回的指针也就指向一块被销毁的内存,这种写法得不到想要的结果,是错误的. char* get_str(void) { char *str = "abcd"; return str; } char* str = "abcd";表示先定义个字符串常量,存储在…
int main(int argc, char* argv[]) 這兩個參數的作用是什麼呢?argc 是指命令行輸入參數的個數,argv存儲了所有的命令行參數.假如你的程式是hello.exe,如果在命令行運行該程式,運行命令為: hello.exe hello world 那麼,argc的值是 3,argv[0]是"hello.exe",argv[1]是"hello",argv[2]是"world". 在 linux 裏常看到 cmd -o x…
char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址.此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的. char* get_str(void) { char *str =…
原函数是<The C programint  language >5.11文本行排序的程序,如下: void qsort(void *v[], int left, int right, int (*comp)(void *,void *)) { int i,last; if( left >= right) return; swap(v,left,(left+right)/2); last = left; for(i = left + 1; i <= right; ++i) if(c…
]={"hello","world"}; ]={"hello"};char (*ch3)[6]= ch1; std::cout<<sizeof(ch2)<<" : "<<strlen(*ch2)<<"\n"; //6*sizeof(char*) : 5 std::cout<<sizeof(ch1)<<" : "<…
在刚开始学习C/C++过程中,我们希望输出各个变量的地址来窥探一些我们"百思不得其解"的现象,例如搞清函数堆栈相关的程序内部秘密. 先看下面示例: #include<stdio.h> #include<iostream> using namespace std; class TestArrange { public: long m_lng; char m_ch1; TestArrange() { m_lng = ; m_ch1 = 'a'; m_int = ;…
前戏 先抛出两个问题 如果delete一个指针,但是它真实的类型和指针类型不一样会发生什么? 是谁调用了析构函数? 下面这段代码会发生什么有趣的事情? // delete_diff_type.cpp #include <iostream> using namespace std; class Foo { public: Foo() { cout << "Foo()" << endl; } ~Foo() { cout << "~F…
指针和数组存在着一些本质的区别.当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作 为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的.请看以下的例子: char a[] = "1234567"; char *p = "1234567"; 上述两个变量的内存布局分别如下: 数组a需要在内存中占用8个字节的空间,这段内存区通过名字a来标志.指针p则需要4个…
void的含义 void即“无类型” ,void*则为“无类型指针”,可以指向任何数据类型,所以又叫做“通用指针”. void指针使用规范 ①void指针可以只想任意类型的数据,亦即可用任意数据类型的指针对void指针赋值.例如: int* pint; void* pvoid; pvoid=pint;//不过不能pint=pvoid; 如果要将pvoid赋给其它类型指针,则需要强制类型转换如:pint=(int*)pvoid; ②在ANSI C 标准中,不允许对void指针进行算术运算如pvoi…
最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello"; char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,…
记录一次比较容易引起混淆的地方. #include <stdio.h> char *str(void) { return "nihao\n"; } int main() { printf("%s\n", str); } 如上图所示,打印出来的为乱码. 直接说结论: 此处打印的是str函数的地址,不是"nihao",这个变量的地址,想要打印出"nihao",应该用 str(). 下边又长又屎的分析可以不看,自己犯的迷…
#include<stdio.h> void foo1(const char**p) { } void foo2(const char*p) { } int main(int argc,char **argv) { foo1(argv); char *p; foo2(p); ; } 为什么第一个调用有警告,第二个没有? 要解释这个问题,真是破费心机. ANSI C 6.3.16.1节对于简单赋值这样描述: 两个操作数都是指向有限定符或者无限定符的相容类型的指针,左边指针所指向的类型必须具有右边…
char *s 和 char s[] 的区别小结 博客分类: C语言 c教育 . 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello"; char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是…
对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误. char *s1 = "hello"; char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错. char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改…
1.新建一个C#-Windows-类库(用于创建C#类库(.dll)的项目)类型的工程 2.对于普通C++函数 XXXX_API void cppFun(int i); 在cs代码中添加 [DllImport("c++xxxx.dll")] public static extern void cppFun(int i); 3.对于C++中的结构体,因为C++中结构体默认访问控制为public,而C#中结构体默认为private,所以要显示指定一下 typedef struct { ch…
[转] 最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello";char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符…
@2019-07-31 struct MyData { int nLen; ]; }; 开始没有理解红色部分的内容,上网搜索下,发现用处很大,记录下来. 在结构中,data是一个数组名:但该数组没有元素:该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容):这种声明方法可以巧妙的实现C语言里的数组扩展. 实际用时采取这样: struct MyData *p = (struct My…
https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &); 将pf声明为指向函数的指针,带有两个const string&类型的形参和bool类型的返回值. 注意: *pf两侧的圆括号是必须的. c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…); c++函数指针的定义形式:返回类型 (类名称::*函数成员名…
转自:https://blog.csdn.net/tonglin12138/article/details/86516789 写在前面:开门见山,大家看下面这个例子: unsigned char err; unsigned char f; unsigned char a(unsigned char i, void *j){ if(j==(void*)0) return 0; *(unsigned char*)j=1; return 1; void * 就是无类型指针类型,j仅仅是一个指针,他所指…
初始化 char str[10]="Hello"; char str[10]={'H','e','l','l','o','\0'}; char str[10]={'H'}; char str[10]={0}; char str[10]="Hello, world.\n"; char str[]="Hello, world.\n"; 第一种情况:初始化数据小于数组长度 如前面两个初始化的例子,这两个例子的效果一样,前五个字符为Hello,剩余的用'…
char* s1 = "hello";//字符串常量 s是一个保存了字符串首地址的指针变量,同时也是字符串的名字,s的内容是第一个字符的地址,当s指向常量字符串时候,内容不能改变(s[1]='y';错的!因为s[1]就是第二个常量字符的地址,这个地址是唯一的,不能改变!),但是整体可以修改(s = "addd"就可以). cout << s1 ;// "hello" cout << *s1; //'h' cout <…
世间真正温煦的春色,都熨帖者大地,潜伏在深谷. 一.简介 goto与void是两个不常用的关键字,C语言中的Goto关键字传承字汇编语言,使用方法也与汇编语言相同.void是类型关键字,可修饰函数和变量. 二.关键词详解 2.1 goto 2.1.1 使用方法 #include <stdio.h> void main(void){ goto C; //可直接跳转到标识的位置,忽略中间的程序. printf("%d\n",sizeof(void)); C: printf(&q…
虽然python开发效率很高,但作为脚本语言,其性能不高,所以为了兼顾开发效率和性能,通常把性能要求高的模块用c或c++来实现或者在c或c++中运行python脚本来处理逻辑,前者通常是python中一些模块的实现方式,后者服务端程序(实现业务扩展或是Plugin功能)和游戏开发(脚本只处理逻辑)中比较常见.本文主要介绍通过在c中运行python脚本来实现python与c的相互调用,并通过c和python脚本设置同一段内存区域为例子来讲解. 准备工作 为了在c中运行python脚本,需要在程序链…